HDFS Reader提供了读取分布式文件系统数据存储的能力。在底层实现上,HDFS Reader获取分布式文件系统上文件的数据,并转换为数据集成传输协议传递给Writer。
使用限制
目前不支持阿里云文件存储HDFS版。
背景信息
HDFS Reader实现了从Hadoop分布式文件系统HDFS中,读取文件数据并转为数据集成协议的功能 。
例如,TextFile是Hive建表时默认使用的存储格式,数据不进行压缩。本质上TextFile是以文本的形式将数据存放在HDFS中,对于数据集成而言,HDFS Reader在实现上与OSS Reader有很多相似之处。
ORCFile的全名是Optimized Row Columnar File,是对RCFile的优化,该文件格式可以提供一种高效的方法来存储Hive数据。HDFS Reader利用Hive提供的OrcSerde类,读取解析ORCFile文件的数据。
- 由于连通默认资源组到HDFS的网络链路比较复杂,建议您使用独享数据集成资源组完成数据同步任务。您需要确保您的独享数据集成资源组具备HDFS的namenode和datanode的网络访问能力。
- HDFS默认情况下,使用网络白名单进行数据安全。基于此种情况,建议您使用独享数据集成资源组完成针对HDFS的数据同步任务。
- 您通过脚本模式配置HDFS同步作业,并不依赖HDFS数据源网络连通性测试通过,针对此类错误您可以临时忽略。
- 数据集成同步进程以admin账号启动,您需要确保操作系统的admin账号具备访问相应HDFS文件的读写权限,若无权限,可以转脚本模式,添加
"hdfsUsername": "有权限的用户"
。
支持的功能
- 支持TextFile、ORCFile、rcfile、sequence file、csv和parquet格式的文件,且要求文件内容存放的是一张逻辑意义上的二维表。
- 支持多种类型数据读取(使用String表示),支持列裁剪,支持列常量。
- 支持递归读取、支持正则表达式
*
和?
。 - 支持ORCFile数据压缩,目前支持SNAPPY和ZLIB两种压缩方式。
- 支持SequenceFile数据压缩,目前支持lZO压缩方式。
- 多个File可以支持并发读取。
- CSV类型支持压缩格式有gzip、bz2、zip、lzo、lzo_deflate和snappy。
- 目前插件中Hive版本为1.1.1,Hadoop版本为2.7.1(Apache适配JDK1.6],在Hadoop 2.5.0、Hadoop 2.6.0和Hive 1.2.0测试环境中写入正常。
支持的数据类型
由于这些文件表的元数据信息由Hive维护,并存放在Hive自己维护的元数据库(如MySQL)中。目前HDFS Reader不支持对Hive元数据的数据库进行访问查询,因此您在进行类型转换时,必须指定数据类型。
类型分类 | 数据集成column配置类型 | Hive数据类型 |
---|---|---|
整数类 | long | tinyint、smallint、int和bigint |
浮点类 | double | float和double |
字符串类 | string | string、char、varchar、struct、map、array、union和binary |
日期时间类 | date | date和timestamp |
布尔类 | boolean | boolean |
- long:HDFS文件中的整型类型数据,例如123456789。
- double:HDFS文件中的浮点类型数据,例如3.1415。
- bool:HDFS文件中的布尔类型数据,例如true、false,不区分大小写。
- date:HDFS文件中的时间类型数据,例如2014-12-31 00:00:00。
Hive支持的数据类型TIMESTAMP可以精确到纳秒级别,所以TextFile、ORCFile中TIMESTAMP存放的数据类似于2015-08-21 22:40:47.397898389
。如果转换的类型配置为数据集成的DATE,转换之后会导致纳秒部分丢失。所以如果需要保留纳秒部分的数据,请配置转换类型为数据集成的字符串类型。
参数说明
参数 | 描述 | 是否必选 | 默认值 |
---|---|---|---|
path | 要读取的文件路径,如果要读取多个文件,可以使用简单正则表达式匹配,例如/hadoop/data_201704* ,如果文件以时间命名且较为规律,则可以结合调度参数使用,调度参数将根据业务时间动态替换,详情请参见调度参数概述:
请注意以下事项:
|
是 | 无 |
defaultFS | Hadoop HDFS文件系统namenode节点地址。公共资源组不支持Hadoop高级参数HA的配置。 | 是 | 无 |
fileType | 文件的类型,目前仅支持您配置为TEXT、ORC、RC、SEQ、CSV和parquet。HDFS Reader能够自动识别文件的类型,并使用对应文件类型的读取策略。HDFS Reader在做数据同步前,会检查您配置的路径下所有需要同步的文件格式是否和fileType一致,如果不一致任务会失败。
fileType可以配置的参数值列表如下所示:
由于TextFile和ORCFile是两种不同的文件格式,所以HDFS Reader对这两种文件的解析方式也存在差异,这种差异导致Hive支持的复杂复合类型(例如map、array、struct和union)在转换为数据集成支持的String类型时,转换的结果格式略有差异,以map类型为例:
如上述转换结果所示,数据本身没有变化,但是表示的格式略有差异。所以如果您配置的文件路径中要同步的字段在Hive中是复合类型的话,建议配置统一的文件格式 。 最佳实践建议:
对于您指定的column信息,type必须填写,index和value必须选择其一。 |
是 | 无 |
column | 读取字段列表,type指定源数据的类型,index指定当前列来自于文本第几列(以0开始),value指定当前类型为常量。不从源头文件读取数据,而是根据value值自动生成对应的列。默认情况下,您可以全部按照STRING类型读取数据,配置为"column": ["*"] 。
您也可以指定column字段信息(文件数据列和常量列配置二选一),配置如下。
说明
|
是 | 无 |
fieldDelimiter | 读取的字段分隔符,HDFS Reader在读取TextFile数据时,需要指定字段分割符,如果不指定默认为逗号(,)。HDFS Reader在读取ORCFile时,您无需指定字段分割符,Hive本身的默认分隔符为\u0001。
说明
|
否 | , |
encoding | 读取文件的编码配置。 | 否 | utf-8 |
nullFormat | 文本文件中无法使用标准字符串定义null(空指针),数据集成提供nullFormat定义哪些字符串可以表示为null。
例如您配置 说明 字符串的null(n、u、l、l四个字符)和实际的null不同。
|
否 | 无 |
compress | 当fileType(文件类型)为csv下的文件压缩方式,目前仅支持gzip、bz2、zip、lzo、lzo_deflate、hadoop-snappy和framing-snappy压缩。
说明
|
否 | 无 |
parquetSchema |
如果您的文件格式类型为Parquet,在配置column配置项的基础上,您还需配置parquetSchema,具体表示parquet存储的类型说明。您需要确保填写parquetSchema后,整体配置符合JSON语法。
parquetSchema的配置格式说明如下:
配置示例如下所示。
|
否 | 无 |
csvReaderConfig | 读取CSV类型文件参数配置,Map类型。读取CSV类型文件使用的CsvReader进行读取,会有很多配置,不配置则使用默认值。
常见配置如下所示。
所有配置项及默认值,配置时csvReaderConfig的map中请严格按照以下字段名字进行配置。
|
否 | 无 |
hadoopConfig | hadoopConfig中可以配置与Hadoop相关的一些高级参数,例如HA的配置。公共资源组不支持Hadoop高级参数HA的配置。
说明
上述参数为hdfs reader插件中配置的kerberos认证。如果您在HDFS数据源已经配置了kerberos认证,则在hdfs reader插件中无需重复配置。配置HDFS数据源,详情请参见配置HDFS数据源 |
无 | |
haveKerberos | 是否有Kerberos认证,默认为false。例如用户配置为true,则配置项kerberosKeytabFilePath和kerberosPrincipal为必填。 | 否 | false |
kerberosKeytabFilePath | Kerberos认证keytab文件的绝对路径。如果haveKerberos为true,则必选。 | 否 | 无 |
kerberosPrincipal | Kerberos认证Principal名,如****/hadoopclient@**.*** 。如果haveKerberos为true,则必选。
说明 由于Kerberos需要配置keytab认证文件的绝对路径,您需要在独享数据集成资源组上使用此功能。配置示例如下。
|
否 | 无 |
向导开发介绍
打开新建的数据同步节点,即可进行同步任务的配置,详情请参见通过向导模式配置离线同步任务。
- 选择数据源。
配置同步任务的数据来源和数据去向。
参数 描述 数据源 即上述参数说明中的datasource,通常输入您配置的数据源名称。 文件路径 即上述参数说明中的path。 文本类型 即上述参数说明中的fileType。读取的文件类型,目前支持您配置为TEXT、ORC、RC、SEQ、CSV和parquet。 字段分隔符 即上述参数说明中的fieldDelimiter,默认值为(,)。 文件编码 即上述脚本模式参数说明中的encoding,默认值为utf-8。 Kerberos认证 是否有Kerberos认证,默认为否,当配置为是的时候,配置项Keytab文件路径和Principal名为必填。详情请参见附录:配置Kerberos认证。 是否忽略(文件不存在时) 用户配置的文件,或者文件夹不存在时,是否忽略(即日志中不报异常信息),是表示文件不存在则忽略,否表示文件不存在则任务出错。默认值为否。 NullFormat 即上述参数说明中的NullFormat。定义哪些字符串可以表示为null。 HadoopConfig hadoopConfig中可以配置与Hadoop相关的一些高级参数,例如HA的配置。公共资源组不支持Hadoop高级参数HA的配置。 - 字段映射,即上述参数说明中的column。默认使用同行映射。您可以单击
图标手动编辑源表字段 ,一行表示一个字段,首尾空行会被采用,其它空行会被忽略。
说明 index从0开始(下标索引从0开始计数),表示从本地文本文件第一列开始读取数据。 - 通道控制。
参数 描述 任务期望最大并发数 数据同步任务内,可以从源并行读取或并行写入数据存储端的最大线程数。向导模式通过界面化配置并发数,指定任务所使用的并行度。 同步速率 设置同步速率可以保护读取端数据库,以避免抽取速度过大,给源库造成太大的压力。同步速率建议限流,结合源库的配置,请合理配置抽取速率。 错误记录数 错误记录数,表示脏数据的最大容忍条数。 分布式处理能力 数据同步时,可以将任务切片分散到多台执行节点上并发执行,提高同步速率。该模式下,配置较大任务并发数会增加数据存储访问压力,如需使用该功能,请提前评估数据存储的访问负载。该功能仅支持在独享数据集成资源组配置,详情请参见独享数据集成资源组和新增和使用独享数据集成资源组。
脚本开发介绍
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "hdfs",//插件名
"parameter": {
"path": "",//要读取的文件路径
"datasource": "",//数据源
"hadoopConfig":{
"dfs.data.transfer.protection": "integrity",
"dfs.datanode.use.datanode.hostname" :"true",
"dfs.client.use.datanode.hostname":"true"
},
"column": [
{
"index": 0,//序列号,index从0开始(下标索引从0开始计数),表示从本地文本文件第一列开始读取数据。
"type": "string"//字段类型
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
},
{
"index": 3,
"type": "boolean"
},
{
"format": "yyyy-MM-dd HH:mm:ss", //日期格式
"index": 4,
"type": "date"
}
],
"fieldDelimiter": ",",//列分隔符
"encoding": "UTF-8",//编码格式
"fileType": ""//文本类型
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "stream",
"parameter": {},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""//错误记录数
},
"speed": {
"concurrent": 3,//作业并发数
"throttle": true //当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
"mbps":"12"//限流
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
- fileType配置项必须设置为parquet。
- 如果您要读取parquet文件中的部分列,需在parquetSchema配置项中,指定完整schema结构信息,并在column中根据下标,筛选需要的同步列进行列映射。
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/user/hive/warehouse/addata.db/dw_ads_rtb_monitor_minute/thedate=20170103/hour_id=22/*",
"defaultFS": "h10s010.07100.149:8020",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
}
],
"fileType": "parquet",
"encoding": "UTF-8",
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int32 adx_pid; optional int64 req; optional int64 res; optional int64 suc; optional int64 imp; optional double revenue; }"
}
}