Hive数据源

Hive数据源为您提供读取和写入Hive双向通道的功能,本文为您介绍DataWorks的Hive数据同步的能力支持情况。

背景信息

Hive是基于Hadoop的数据仓库工具,用于解决海量结构化日志的数据统计。Hive可以将结构化的数据文件映射为一张表,并提供SQL查询功能。Hive的本质是一个SQL解析引擎,其底层通过MapReduce实现数据分析,使用HDFS存储处理的数据,将HQL转化为MapReduce程序并在YARN上运行。

Hive Reader插件通过访问HiveMetastore服务,获取您配置的数据表的元数据信息。您可以基于HDFS文件和Hive JDBC两种方式读取数据:

  • 基于HDFS文件读取数据

    Hive Reader插件通过访问HiveMetastore服务,解析出您配置的数据表的HDFS文件存储路径、文件格式、分隔符等信息后,再通过读取HDFS文件的方式读取Hive中的表数据。

  • 基于Hive JDBC读取数据

    Hive Reader插件通过Hive JDBC客户端连接HiveServer2服务读取数据。Hive Reader支持通过where条件过滤数据,并支持直接通过SQL读取数据。

Hive Writer插件通过访问Hive Metastore服务,解析出您配置的数据表的HDFS文件存储路径、文件格式和分隔符等信息。通过写HDFS文件的方式,将数据写入到HDFS中,再通过Hive JDBC客户端执行LOAD DATA SQL语句,加载HDFS文件中的数据至Hive表。

Hive Writer底层的逻辑和HDFS Writer插件一致,您可以在Hive Writer插件参数中配置HDFS Writer相关的参数,配置的参数会透传给HDFS Writer插件。

支持的版本

Hive插件支持的版本

0.8.0
0.8.1
0.9.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
1.0.0
1.0.1
1.1.0
1.1.1
1.2.0
1.2.1
1.2.2
2.0.0
2.0.1
2.1.0
2.1.1
2.2.0
2.3.0
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
2.3.7
3.0.0
3.1.0
3.1.1
3.1.2
3.1.3
0.8.1-cdh4.0.0
0.8.1-cdh4.0.1
0.9.0-cdh4.1.0
0.9.0-cdh4.1.1
0.9.0-cdh4.1.2
0.9.0-cdh4.1.3
0.9.0-cdh4.1.4
0.9.0-cdh4.1.5
0.10.0-cdh4.2.0
0.10.0-cdh4.2.1
0.10.0-cdh4.2.2
0.10.0-cdh4.3.0
0.10.0-cdh4.3.1
0.10.0-cdh4.3.2
0.10.0-cdh4.4.0
0.10.0-cdh4.5.0
0.10.0-cdh4.5.0.1
0.10.0-cdh4.5.0.2
0.10.0-cdh4.6.0
0.10.0-cdh4.7.0
0.10.0-cdh4.7.1
0.12.0-cdh5.0.0
0.12.0-cdh5.0.1
0.12.0-cdh5.0.2
0.12.0-cdh5.0.3
0.12.0-cdh5.0.4
0.12.0-cdh5.0.5
0.12.0-cdh5.0.6
0.12.0-cdh5.1.0
0.12.0-cdh5.1.2
0.12.0-cdh5.1.3
0.12.0-cdh5.1.4
0.12.0-cdh5.1.5
0.13.1-cdh5.2.0
0.13.1-cdh5.2.1
0.13.1-cdh5.2.2
0.13.1-cdh5.2.3
0.13.1-cdh5.2.4
0.13.1-cdh5.2.5
0.13.1-cdh5.2.6
0.13.1-cdh5.3.0
0.13.1-cdh5.3.1
0.13.1-cdh5.3.2
0.13.1-cdh5.3.3
0.13.1-cdh5.3.4
0.13.1-cdh5.3.5
0.13.1-cdh5.3.6
0.13.1-cdh5.3.8
0.13.1-cdh5.3.9
0.13.1-cdh5.3.10
1.1.0-cdh5.3.6
1.1.0-cdh5.4.0
1.1.0-cdh5.4.1
1.1.0-cdh5.4.2
1.1.0-cdh5.4.3
1.1.0-cdh5.4.4
1.1.0-cdh5.4.5
1.1.0-cdh5.4.7
1.1.0-cdh5.4.8
1.1.0-cdh5.4.9
1.1.0-cdh5.4.10
1.1.0-cdh5.4.11
1.1.0-cdh5.5.0
1.1.0-cdh5.5.1
1.1.0-cdh5.5.2
1.1.0-cdh5.5.4
1.1.0-cdh5.5.5
1.1.0-cdh5.5.6
1.1.0-cdh5.6.0
1.1.0-cdh5.6.1
1.1.0-cdh5.7.0
1.1.0-cdh5.7.1
1.1.0-cdh5.7.2
1.1.0-cdh5.7.3
1.1.0-cdh5.7.4
1.1.0-cdh5.7.5
1.1.0-cdh5.7.6
1.1.0-cdh5.8.0
1.1.0-cdh5.8.2
1.1.0-cdh5.8.3
1.1.0-cdh5.8.4
1.1.0-cdh5.8.5
1.1.0-cdh5.9.0
1.1.0-cdh5.9.1
1.1.0-cdh5.9.2
1.1.0-cdh5.9.3
1.1.0-cdh5.10.0
1.1.0-cdh5.10.1
1.1.0-cdh5.10.2
1.1.0-cdh5.11.0
1.1.0-cdh5.11.1
1.1.0-cdh5.11.2
1.1.0-cdh5.12.0
1.1.0-cdh5.12.1
1.1.0-cdh5.12.2
1.1.0-cdh5.13.0
1.1.0-cdh5.13.1
1.1.0-cdh5.13.2
1.1.0-cdh5.13.3
1.1.0-cdh5.14.0
1.1.0-cdh5.14.2
1.1.0-cdh5.14.4
1.1.0-cdh5.15.0
1.1.0-cdh5.16.0
1.1.0-cdh5.16.2
1.1.0-cdh5.16.99
2.1.1-cdh6.1.1
2.1.1-cdh6.2.0
2.1.1-cdh6.2.1
2.1.1-cdh6.3.0
2.1.1-cdh6.3.1
2.1.1-cdh6.3.2
2.1.1-cdh6.3.3
3.1.1-cdh7.1.1

使用限制

  • Hive数据源支持使用Serverless资源组(推荐)独享数据集成资源组

  • 目前仅支持读取TextFile、ORCFile和ParquetFile三种格式的文件。

  • 使用数据集成向Hive集群进行离线同步的过程中,会在服务端侧产生临时文件,在同步任务执行完成时,会自动删除。您需要留意服务端HDFS目录文件数限制,避免非预期的文件数达到上限导致HDFS文件系统不可用,DataWorks平台无法保障文件数在HDFS目录允许范围内。

    说明

    服务端可以通过修改dfs.namenode.fs-limits.max-directory-items参数,定义单个目录下不含递归的最大目录数或者文件数,默认值1048576,取值范围1~6400000。可以将HDFS的参数dfs.namenode.fs-limits.max-directory-items调大或者清理不需要的文件以规避此问题。

  • 访问Hive数据源时目前支持使用Kerberos身份认证方式和SSL认证认证方式,如果访问数据源时不需要进行身份认证,则新增数据源时认证选项选择无认证

  • 在DataWorks使用Kerberos认证身份访问Hive数据源时,如果HiveServer2与metastore均开启了Kerberos认证,但是两者认证的principal存在不一致时,需要在扩展参数配置项做如下配置:

     {
    "hive.metastore.kerberos.principal": "your metastore principal"
    }

支持的字段类型

离线读

类型分类

Hive数据类型

字符串类

CHAR、VARCHAR、STRING

整数类

TINYINT、SMALLINT、INT、INTEGER、BIGINT

浮点类

FLOAT、DOUBLE、DECIMAL

日期时间类

TIMESTAMP、DATE

布尔型

BOOLEAN

数据同步前准备

不同的数据源配置模式,准备工作不同,具体如下:

阿里云实例模式

如果您要同步此实例下的OSS表,请选择对应的访问身份,支持阿里云主账号阿里云子账号RAM角色三种访问身份。请确保选择的OSS访问身份有对应的OSS权限,否则数据同步会因为读写权限不足失败。

重要

测试连通性不会校验数据读写权限。

连接串模式

使用DLF的配置

如果您的Hive数据源元数据管理方式使用的是DLF方式,您需要在配置Hive数据源时扩展参数一栏中增加如下内容:

{"dlf.catalog.id" : "my_catalog_xxxx"}

其中my_catalog_xxxx是您在EMR的Hive配置参数dlf.catalog.id里对应的名称。

高可用HA配置

若您要同步的EMR Hive集群开启了高可用,您需要在配置Hive数据源时扩展参数一栏,配置HA的相关信息,格式如下。您可以前往EMR控制台找到目标集群,然后单击操作列的集群服务,获取相关配置值。

{
//HA的相关配置示例如下。
"dfs.nameservices":"testDfs",
"dfs.ha.namenodes.testDfs":"namenode1,namenode2",
"dfs.namenode.rpc-address.testDfs.namenode1": "",
"dfs.namenode.rpc-address.testDfs.namenode2": "",
"dfs.client.failover.proxy.provider.testDfs":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
//(可选)底层存储为OSS时,需在扩展参数中配置以下连接OSS服务所需的参数。
"fs.oss.accessKeyId":"<yourAccessKeyId>",
"fs.oss.accessKeySecret":"<yourAccessKeySecret>",
"fs.oss.endpoint":"oss-cn-<yourRegion>-internal.aliyuncs.com"
}

OSS外表配置

当底层存储为OSS时,请注意以下问题:

  • defaultFS的配置请以oss://为前缀。例如,oss://bucketName

  • 若您要同步的表为OSS外表,您需要在配置Hive数据源时扩展参数一栏配置OSS相关信息。

    {
        "fs.oss.accessKeyId":"<yourAccessKeyId>",
        "fs.oss.accessKeySecret":"<yourAccessKeySecret>",
        "fs.oss.endpoint":"oss-cn-<yourRegion>-internal.aliyuncs.com"
    }
  • 若您要同步的表为OSS-HDFS外表,您需要在配置Hive数据源时扩展参数一栏配置OSS-HDFS的相关信息。

    {
        "fs.oss.accessKeyId":"<yourAccessKeyId>",
        "fs.oss.accessKeySecret":"<yourAccessKeySecret>",
        "fs.oss.endpoint":"cn-<yourRegion>.oss-dls.aliyuncs.com"
    }

CDH模式

如果您需使用CDH模式配置Hive数据源,则需注册CDH集群至DataWorks

创建数据源

在进行数据同步任务开发时,您需要在DataWorks上创建一个对应的数据源,操作流程请参见创建并管理数据源详细的配置参数解释可在配置界面查看对应参数的文案提示

下面是对不同认证选项的参数说明:

Kerberos认证

参数

参数说明

keytab文件

在Kerberos环境中注册服务主体生成的.keytab文件。

conf文件

conf文件指的是Kerberos的配置文件,主要用于定义Kerberos客户端和服务器的各种设置。主要配置文件:

  • krb5.conf:客户端和库使用的配置文件,定义全局默认设置、领域配置、域名映射、应用程序默认设置和日志记录选项。

  • kdc.conf:KDC(Key Distribution Center)服务器的配置文件,定义数据库位置、日志文件位置以及其他KDC特有的设置。

principal

身份实体,可以是用户或服务,具有唯一的名称和相关的加密密钥。

  • 用户principal格式:username@REALM

  • 服务principal格式:service/hostname@REALM

SSL认证

参数

参数说明

Truststore证书文件

启用SSL认证生成的Truststore证书文件,例如truststore.jks文件。

Truststore密码

启用SSL认证生成Truststore证书文件时设置的密码。

Keystore证书文件

启用SSL认证生成的Keystore证书文件,例如keystore.jks文件。

Keystore密码

启用SSL认证生成Keystore证书文件时设置的密码。

数据同步任务开发

数据同步任务的配置入口和通用配置流程可参见下文的配置指导。

单表离线同步任务配置指导

整库离线读同步配置指导

操作流程请参见数据集成侧同步任务配置

附录:脚本Demo与参数说明

离线任务脚本配置方式

如果您配置离线任务时使用脚本模式的方式进行配置,您需要按照统一的脚本格式要求,在任务脚本中编写相应的参数,详情请参见通过脚本模式配置离线同步任务,以下为您介绍脚本模式下数据源的参数配置详情。

Reader脚本Demo

您可以基于HDFS文件和Hive JDBC读取数据:

  • 基于HDFS文件读取数据

    {
        "type": "job",
        "steps": [
            {
                "stepType": "hive",
                "parameter": {
                    "partition": "pt1=a,pt2=b,pt3=c", //分区信息
                    "datasource": "hive_not_ha_****", //数据源名称
                    "column": [ //需要读取的字段列
                        "id",
                        "pt2",
                        "pt1"
                    ],
                    "readMode": "hdfs", //读取方式
                    "table": "part_table_1",
                    "hdfsUsername" : "hdfs",
                    "hivePartitionColumn": [
                        {
                          "type": "string",
                          "value": "分区名1"
                        },
                        {
                          "type": "string",
                          "value": "分区名2"
                         }
                   ]
                },
                "name": "Reader",
                "category": "reader"
            },
            {
                "stepType": "hive",
                "parameter": {
                },
                "name": "Writer",
                "category": "writer"
            }
        ],
        "version": "2.0",
        "order": {
            "hops": [
                {
                    "from": "Reader",
                    "to": "Writer"
                }
            ]
        },
        "setting": {
            "errorLimit": {
                "record": "" //错误记录数
            },
            "speed": {
                "concurrent": 2, //作业并发数
                "throttle": true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
                "mbps":"12"//限流
            }
        }
    }
  • 基于Hive JDBC读取数据

    {
        "type": "job",
        "steps": [
            {
                "stepType": "hive",
                "parameter": {
                    "querySql": "select id,name,age from part_table_1 where pt2='B'",
                    "datasource": "hive_not_ha_****",  //数据源名称
                    "column": [ //需要读取的字段列
                        "id",
                        "name",
                        "age"
                    ],
                    "where": "",
                    "table": "part_table_1",
                    "readMode": "jdbc" //读取方式
                },
                "name": "Reader",
                "category": "reader"
            },
            {
                "stepType": "hive",
                "parameter": {
                },
                "name": "Writer",
                "category": "writer"
            }
        ],
        "version": "2.0",
        "order": {
            "hops": [
                {
                    "from": "Reader",
                    "to": "Writer"
                }
            ]
        },
        "setting": {
            "errorLimit": {
                "record": ""
            },
            "speed": {
                "concurrent": 2,  //作业并发数
                "throttle": true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
                "mbps":"12"//限流            
                
            }
        }
    }

Reader脚本参数

参数

描述

是否必选

默认值

datasource

数据源名称,必须与添加的数据源名称保持一致。

table

表名,用于指定需要同步的表。

说明

请注意大小写。

readMode

读取方式:

  • 基于HDFS文件方式读取数据,配置为"readMode":"hdfs"

  • 基于Hive JDBC方式读取数据,配置为"readMode":"jdbc"

说明
  • 基于Hive JDBC方式读取数据时,支持使用Where条件做数据过滤,但是此场景下,Hive引擎底层可能会生成MapReduce任务,效率较慢。

  • 基于HDFS文件方式读取数据时,不支持使用Where条件做数据过滤,此场景下读取数据时会直接访问Hive表底层的数据文件进行读取,读取效率相对更高。

  • 基于HDFS文件方式不支持读取视图(VIEW)表。

partition

Hive表的分区信息:

  • 如果您基于Hive JDBC读取数据,无需配置该参数。

  • 如果您读取的Hive表是分区表,您需要配置partition信息。同步任务会读取partition对应的分区数据。

    Hive Reader单级分区支持使用星号(*)作为通配符,多级分区不支持通配符。

  • 如果您的Hive表是非分区表,则无需配置partition

column

需要读取的字段列,例如"column": ["id", "name"]

  • 支持列裁剪:即可以导出部分列。

  • 支持列换序,即可以不根据表Schema信息顺序导出列。

  • 支持配置分区列。

  • 支持配置常量。

  • column必须显示指定同步的列集合,不允许为空。

querySql

当您基于Hive JDBC方式读取数据时,可以直接配置querySql读取数据。

where

当您基于Hive JDBC方式读取数据时,可以通过设置where条件过滤数据。

hdfsUsername

基于HDFS方式读取数据,默认会用Hive数据源页面配置的用户读取,若数据源页面配置匿名登录,则会默认使用admin账户读取数据,同步任务时如果出现权限问题,需要转脚本模式配置hdfsUsername

hivePartitionColumn

若期望把分区字段的值,同步到下游,可以转脚本模式配置hivePartitionColumn参数。

Writer脚本Demo

{
    "type": "job",
    "steps": [
        {
            "stepType": "hive",
            "parameter": {
            },
            "name": "Reader",
            "category": "reader"
        },
        {
            "stepType": "hive",
            "parameter": {
                "partition": "year=a,month=b,day=c", // 分区配置
                "datasource": "hive_ha_shanghai", // 数据源
                "table": "partitiontable2", // 目标表
                "column": [ // 列配置
                    "id",
                    "name",
                    "age"
                ],
                "writeMode": "append" ,// 写入模式
                "hdfsUsername" : "hdfs"
            },
            "name": "Writer",
            "category": "writer"
        }
    ],
    "version": "2.0",
    "order": {
        "hops": [
            {
                "from": "Reader",
                "to": "Writer"
            }
        ]
    },
    "setting": {
        "errorLimit": {
            "record": ""
        },
        "speed": {
            "throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
            "concurrent":2, //作业并发数。
            "mbps":"12"//限流
        }
    }
}

Writer脚本参数

参数

描述

是否必选

默认值

datasource

数据源名称,必须与添加的数据源名称保持一致。

column

需要写出的字段列,例如"column": ["id", "name"]

  • 支持列裁剪:即可以导出部分列。

  • column必须显示指定同步的列集合,不允许为空。

  • 不支持列换序。

table

需要写出的Hive表名。

说明

请注意大小写。

partition

Hive表的分区信息:

  • 如果您写出的Hive表是分区表,您需要配置partition信息。同步任务会写出partition对应的分区数据。

  • 如果您的Hive表是非分区表,则无需配置partition

writeMode

Hive表数据的写出模式。数据写出至HDFS文件后,Hive Writer插件会执行LOAD DATA INPATH (overwrite) INTO TABLE,加载数据至Hive表中。

writeMode用于表示数据的加载行为:

  • 如果writeModetruncate,表示先清空数据再加载。

  • 如果writeModeappend,表示保留原有数据。

  • 如果writeMode为其它,则表示数据写出至HDFS文件,无需再加载数据至Hive表。

说明

writeMode是高危参数,请您注意数据的写出目录和writeMode行为,避免误删数据。

加载数据行为需要配合hiveConfig使用,请注意您的配置。

hiveConfig

您可以在hiveConfig中配置进一步的Hive扩展参数,包括hiveCommandjdbcUrlusernamepassword

  • hiveCommand:表示Hive客户端工具的全路径,执行hive -e后,会执行writeMode相关联的LOAD DATA INPATH数据加载操作。

    Hive相关的访问信息由hiveCommand对应的客户端保证。

  • jdbcUrlusernamepassword表示Hive的JDBC访问信息。HiveWriter会通过Hive JDBC驱动访问Hive后,执行writeMode相关联的LOAD DATA INPATH数据加载操作。

    "hiveConfig": {
        "hiveCommand": "",
        "jdbcUrl": "",
        "username": "",
        "password": ""
            }
  • Hive Writer插件底层通过HDFS客户端,写入数据至HDFS文件。您也可以通过hiveConfig配置HDFS客户端的高级参数。

hdfsUsername

向Hive表写数据时,默认会用Hive数据源页面配置的用户写入,若数据源页面配置匿名登录,则会默认使用admin账户写入数据,同步任务时如果出现权限问题,需要转脚本模式配置hdfsUsername