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数据源支持使用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数据源支持的离线读字段类型如下:
类型分类  | Hive数据类型  | 
字符串类  | CHAR、VARCHAR、STRING  | 
整数类  | TINYINT、SMALLINT、INT、INTEGER、BIGINT  | 
浮点类  | FLOAT、DOUBLE、DECIMAL  | 
日期时间类  | TIMESTAMP、DATE  | 
布尔型  | BOOLEAN  | 
数据同步前准备
不同的数据源配置模式,准备工作不同,具体如下:
阿里云实例模式
如果您要同步此实例下的OSS表,请选择对应的访问身份,支持阿里云主账号,阿里云子账号及RAM角色三种访问身份。请确保选择的OSS访问身份有对应的OSS权限,否则数据同步会因为读写权限不足失败。
测试连通性不会校验数据读写权限。
连接串模式
使用DLF的配置
如果您的Hive数据源来源为EMR,且元数据管理方式使用的是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文件  | 
 
  | 
principal  | 身份实体,可以是用户或服务,具有唯一的名称和相关的加密密钥。 
  | 
SSL认证
参数  | 参数说明  | 
Truststore证书文件  | 启用SSL认证生成的Truststore证书文件,例如  | 
Truststore密码  | 启用SSL认证生成Truststore证书文件时设置的密码。  | 
Keystore证书文件  | 启用SSL认证生成的Keystore证书文件,例如  | 
Keystore密码  | 启用SSL认证生成Keystore证书文件时设置的密码。  | 
数据同步任务开发
数据同步任务的配置入口和通用配置流程可参见下文的配置指导。
单表离线同步任务配置指导
脚本模式配置的全量参数和脚本Demo请参见下文的附录:脚本Demo与参数说明。
整库离线读同步配置指导
操作流程请参见整库离线同步任务。
附录:脚本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", "fileSystemUsername" : "hdfs", "hivePartitionColumn": [ { "type": "string", "value": "分区名1" }, { "type": "string", "value": "分区名2" } ], "successOnNoFile":true }, "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_****", //数据源名称 "session": [ "mapred.task.timeout=600000" ], "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  | 读取方式: 
 说明  
  | 否  | 无  | 
partition  | Hive表的分区信息: 
  | 否  | 无  | 
session  | Hive JDBC读取会话Session粒度配置,可设置客户端参数例如:SET hive.exec.parallel=true  | 否  | 无  | 
column  | 需要读取的字段列,例如 
  | 是  | 无  | 
querySql  | 当您基于Hive JDBC方式读取数据时,可以直接配置querySql读取数据。  | 否  | 无  | 
where  | 当您基于Hive JDBC方式读取数据时,可以通过设置where条件过滤数据。  | 否  | 无  | 
fileSystemUsername  | 基于HDFS方式读取数据,默认会用Hive数据源页面配置的用户读取,若数据源页面配置匿名登录,则会默认使用admin账户读取数据,同步任务时如果出现权限问题,需要转脚本模式配置fileSystemUsername。  | 否  | 无  | 
hivePartitionColumn  | 若期望把分区字段的值,同步到下游,可以转脚本模式配置hivePartitionColumn参数。  | 否  | 无  | 
successOnNoFile  | HDFS模式读时,如果目录为空,同步任务是否正常执行。  | 否  | 无  | 
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" ,// 写入模式
                "fileSystemUsername" : "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  | 需要写出的字段列,例如 
  | 是  | 无  | 
table  | 需要写出的Hive表名。 说明  请注意大小写。  | 是  | 无  | 
partition  | Hive表的分区信息: 
  | 否  | 无  | 
writeMode  | Hive表数据的写出模式。数据写出至HDFS文件后,Hive Writer插件会执行 writeMode用于表示数据的加载行为: 
 说明  writeMode是高危参数,请您注意数据的写出目录和writeMode行为,避免误删数据。 加载数据行为需要配合hiveConfig使用,请注意您的配置。  | 是  | 无  | 
hiveConfig  | 您可以在hiveConfig中配置进一步的Hive扩展参数,包括hiveCommand、jdbcUrl、username和password: 
  | 是  | 无  | 
fileSystemUsername  | 向Hive表写数据时,默认会用Hive数据源页面配置的用户写入,若数据源页面配置匿名登录,则会默认使用admin账户写入数据,同步任务时如果出现权限问题,需要转脚本模式配置fileSystemUsername。  | 否  | 无  | 
enableColumnExchange  | 参数配置为True时,则开启列换序。 说明  仅支持Text格式。  | 否  | 无  | 
nullFormat  | 数据集成提供nullFormat定义哪些字符串可以表示为null。 例如:配置 说明  字符串的null(n、u、l、l四个字符)和实际的null不同  | 否  | 无  |