HDFS是一个分布式文件系统,为您提供读取和写入HDFS双向通道的功能,本文为您介绍DataWorks的HDFS数据同步的能力支持情况。
支持的版本
目前不支持阿里云文件存储HDFS版。
使用限制
离线读
- 使用HDFS Reader时,请注意以下事项: - 由于连通默认资源组到HDFS的网络链路比较复杂,建议您使用Serverless资源组(推荐)和独享数据集成资源组完成数据同步任务。您需要确保您的资源组具备HDFS的namenode和datanode的网络访问能力。 
- HDFS默认情况下,使用网络白名单进行数据安全。基于此种情况,建议您使用Serverless资源组(推荐)和独享数据集成资源组完成针对HDFS的数据同步任务。 
- 您通过脚本模式配置HDFS同步作业,并不依赖HDFS数据源网络连通性测试通过,针对此类错误您可以临时忽略。 
- 数据集成同步进程以admin账号启动,您需要确保操作系统的admin账号具备访问相应HDFS文件的读写权限,若无权限,可以转脚本模式,添加 - "hdfsUsername": "有权限的用户"。
 
- HDFS Reader支持以下功能: - 支持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测试环境中写入正常。 
 重要- HDFS Reader暂不支持单个File多线程并发读取,此处涉及到单个File内部切分算法。 
离线写
使用HDFS Writer时,请注意以下事项:
- 目前HDFS Writer仅支持TextFile、ORCFile和ParquetFile三种格式的文件,且文件内容存放的必须是一张逻辑意义上的二维表。 
- 由于HDFS是文件系统,不存在schema的概念,因此不支持对部分列写入。 
- 目前不支持DECIMAL、BINARY、ARRAYS、MAPS、STRUCTS和UNION等Hive数据类型。 
- 对于Hive分区表目前仅支持一次写入单个分区。 
- 对于TextFile,需要保证写入HDFS文件的分隔符与在Hive上创建表时的分隔符一致,从而实现写入HDFS数据与Hive表字段关联。 
- 目前插件中的Hive版本为1.1.1,Hadoop版本为2.7.1(Apache为适配JDK1.7)。在Hadoop2.5.0、Hadoop2.6.0和Hive1.2.0测试环境中写入正常。 
- HDFS Writer仅支持使用独享数据集成资源组。 
实现过程
HDFS Writer的实现过程如下所示:
- 根据您指定的path,创建一个HDFS文件系统上不存在的临时目录。 - 创建规则:path_随机。 
- 将读取的文件写入这个临时目录。 
- 全部写入后,将临时目录下的文件移动到您指定的目录(在创建文件时保证文件名不重复)。 
- 删除临时目录。如果在此过程中,发生网络中断等情况造成无法与HDFS建立连接,需要您手动删除已经写入的文件和临时目录。 
数据同步需要使用Admin账号,并且有访问相应文件的读写权限。
支持的字段类型
离线读
由于文件表的元数据信息由Hive维护,并存放在Hive自己维护的元数据库(如MySQL)中。目前HDFS Reader不支持对Hive元数据的数据库进行访问查询,因此您在进行类型转换时,必须指定数据类型。
RCFile、ParquetFile、ORCFile、TextFile和SequenceFile中的类型,会默认转为数据集成支持的内部类型,如下表所示。
| 类型分类 | 数据集成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,转换之后会导致纳秒部分丢失。因此,如果需要保留纳秒部分的数据,请配置转换类型为数据集成的字符串类型。
离线写
HDFS Writer提供向HDFS文件系统指定路径中写入TextFile文件、 ORCFile文件以及ParquetFile格式文件,文件内容可以与Hive中的表关联。目前HDFS Writer支持大部分Hive类型,请注意检查您的数据类型。
HDFS Writer针对Hive数据类型的转换列表,如下所示。
column的配置需要和Hive表对应的列类型保持一致。
| 类型分类 | 数据库数据类型 | 
| 整数类 | TINYINT、SMALLINT、INT和BIGINT | 
| 浮点类 | FLOAT和DOUBLE | 
| 字符串类 | CHAR、VARCHAR和STRING | 
| 布尔类 | BOOLEAN | 
| 日期时间类 | DATE和TIMESTAMP | 
创建数据源
在进行数据同步任务开发时,您需要在DataWorks上创建一个对应的数据源,操作流程请参见创建并管理数据源,详细的配置参数解释可在配置界面查看对应参数的文案提示。
数据同步任务开发
数据同步任务的配置入口和通用配置流程可参见下文的配置指导。
单表离线同步任务配置指导
- 操作流程请参见通过向导模式配置离线同步任务、通过脚本模式配置离线同步任务。 
- 脚本模式配置的全量参数和脚本Demo请参见下文的附录:脚本Demo与参数说明。 
附录:脚本Demo与参数说明
离线任务脚本配置方式
如果您配置离线任务时使用脚本模式的方式进行配置,您需要按照统一的脚本格式要求,在任务脚本中编写相应的参数,详情请参见通过脚本模式配置离线同步任务,以下为您介绍脚本模式下数据源的参数配置详情。
Reader脚本Demo
{
    "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"
            }
        ]
    }
}parquetSchema的HDFS Reader配置示例如下。
- 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; }"
    }
}Reader脚本参数
| 参数 | 描述 | 是否必选 | 默认值 | 
| path | 要读取的文件路径,如果要读取多个文件,可以使用简单正则表达式匹配,例如 
 请注意以下事项: 
 | 是 | 无 | 
| 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字段信息(文件数据列和常量列配置二选一),配置如下。 说明  
 | 是 | 无 | 
| 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认证文件的绝对路径,您需要在资源组上使用此功能。配置示例如下。  | 否 | 无 | 
Writer脚本Demo
{
    "type": "job",
    "version": "2.0",//版本号。
    "steps": [
        { 
            "stepType": "stream",
            "parameter": {},
            "name": "Reader",
            "category": "reader"
        },
        {
            "stepType": "hdfs",//插件名。
            "parameter": {
                "path": "",//存储到Hadoop HDFS文件系统的路径信息。
                "fileName": "",//HDFS Writer写入时的文件名。
                "compress": "",//HDFS文件压缩类型。
                "datasource": "",//数据源。
                "column": [
                    {
                        "name": "col1",//字段名。
                        "type": "string"//字段类型。
                    },
                    {
                        "name": "col2",
                        "type": "int"
                    },
                    {
                        "name": "col3",
                        "type": "double"
                    },
                    {
                        "name": "col4",
                        "type": "boolean"
                    },
                    {
                        "name": "col5",
                        "type": "date"
                    }
                ],
                "writeMode": "",//写入模式。
                "fieldDelimiter": ",",//列分隔符。
                "encoding": "",//编码格式。
                "fileType": "text"//文本类型。
            },
            "name": "Writer",
            "category": "writer"
        }
    ],
    "setting": {
        "errorLimit": {
            "record": ""//错误记录数。
        },
        "speed": {
            "concurrent": 3,//作业并发数。
            "throttle": false //false代表不限流,下面的限流的速度不生效;true代表限流。
        }
    },
    "order": {
        "hops": [
            {
                "from": "Reader",
                "to": "Writer"
            }
        ]
    }
}Writer脚本参数
| 参数 | 描述 | 是否必选 | 默认值 | 
| defaultFS | Hadoop HDFS文件系统namenode节点地址,例如 | 是 | 无 | 
| fileType | 文件的类型,目前仅支持您配置为text、orc和parquet: 
 | 是 | 无 | 
| path | 存储到Hadoop HDFS文件系统的路径信息,HDFS Writer会根据并发配置在path目录下写入多个文件。 为了与Hive表关联,请填写Hive表在HDFS上的存储路径。例如Hive上设置的数据仓库的存储路径为 | 是 | 无 | 
| fileName | HDFS Writer写入时的文件名,实际执行时会在该文件名后添加随机的后缀作为每个线程写入实际文件名。 | 是 | 无 | 
| column | 写入数据的字段,不支持对部分列写入。 为了与Hive中的表关联,需要指定表中所有字段名和字段类型,其中name指定字段名,type指定字段类型。 您可以指定column字段信息,配置如下。  | 是(如果filetype为parquet,此项无需填写) | 无 | 
| writeMode | HDFS Writer写入前数据清理处理模式: 
 说明  Parquet格式文件不支持Append,所以只能是noConflict。 | 是 | 无 | 
| fieldDelimiter | HDFS Writer写入时的字段分隔符,需要您保证与创建的Hive表的字段分隔符一致,否则无法在Hive表中查到数据。 说明  仅支持单字符分隔符,如果输入多字符将导致运行时报错。 | 是(如果filetype为parquet,此项无需填写) | 无 | 
| compress | HDFS文件压缩类型,默认不填写,则表示没有压缩。 其中text类型文件支持gzip和bzip2压缩类型。 | 否 | 无 | 
| encoding | 写文件的编码配置。 | 否 | 无压缩 | 
| parquetSchema | 写Parquet格式文件时的必填项,用来描述目标文件的结构,所以此项当且仅当fileType为parquet时生效,格式如下。 配置项说明如下: 
 说明  每行列设置必须以分号结尾,最后一行也要写上分号。 示例如下。  | 否 | 无 | 
| hadoopConfig | hadoopConfig中可以配置与Hadoop相关的一些高级参数,例如HA的配置。公共资源组不支持Hadoop高级参数HA的配置,请新增和使用自定义数据集成资源组。  | 否 | 无 | 
| dataxParquetMode | 针对Parquet文件进行同步的模式。使用fields支持array、map和struct等复杂类型。可选值包括fields和columns。 配置dataxParquetMode为fields时,支持hdfs over oss,即HDFS的存储为OSS,OSS的数据存储格式为parquet。此时您可以在hadoopConfig中增加OSS相关的参数,详情如下: 
 访问OSS的示例如下所示。  | 否 | columns | 
| haveKerberos | 是否有Kerberos认证,默认为false。如果您配置为true,则配置项kerberosKeytabFilePath和kerberosPrincipal为必填。 | 否 | false | 
| kerberosKeytabFilePath | Kerberos认证keytab文件的绝对路径。 | 如果haveKerberos为true,则必选。 | 无 | 
| kerberosPrincipal | Kerberos认证Principal名,如****/hadoopclient@**.*** 。如果haveKerberos为true,则必选。 由于Kerberos需要配置keytab认证文件的绝对路径,您需要在自定义资源组上使用此功能。配置示例如下。  | 否 | 无 |