1. 引言
DataX 是阿里开源的数据同步工具,支持多种数据源之间的高效传输。在实际业务中,我们经常需要把 Hive 表中的数据同步到其他存储系统。本文以一个完整的 DataX 任务脚本为例,演示如何使用 HDFS Reader 读取 Hive 的 ORC 格式表,并通过 Stream Writer 将数据打印到控制台,帮助读者快速理解 DataX 的配置结构和字段映射方式。
2. 任务脚本概览
下面是一个完整的 DataX 任务 JSON 脚本,它从 Hive 仓库目录读取 ORC 文件,并将数据输出到控制台:
{ "job": { "setting": { "speed": { "channel": 3 } }, "content": [ { "reader": { "name": "hdfsreader", "parameter": { "path": "/user/hive/warehouse/mytable01/*", "defaultFS": "hdfs://xxx:port", "column": [ { "index": 0, "type": "long" }, { "index": 1, "type": "boolean" }, { "type": "string", "value": "hello" }, { "index": 2, "type": "double" } ], "fileType": "orc", "encoding": "UTF-8", "fieldDelimiter": "," } }, "writer": { "name": "streamwriter", "parameter": { "print": true } } } ] } }除了从 Hive 读取数据,DataX 也支持将本地文本文件写入 Hive 的 ORC 表。下面是一个反向的完整脚本模板,它使用 txtfilereader 读取本地 Tab 分隔的文本文件,并通过 hdfswriter 将数据写入 Hive 的 ORC 表:
{ "job": { "setting": { "speed": { "channel": 2 } }, "content": [ { "reader": { "name": "txtfilereader", "parameter": { "path": ["/Users/shf/workplace/txtWorkplace/job/dataorcfull.txt"], "encoding": "UTF-8", "column": [ { "index": 0, "type": "long" }, { "index": 1, "type": "long" }, { "index": 2, "type": "long" }, { "index": 3, "type": "long" }, { "index": 4, "type": "DOUBLE" }, { "index": 5, "type": "DOUBLE" }, { "index": 6, "type": "STRING" }, { "index": 7, "type": "STRING" }, { "index": 8, "type": "STRING" }, { "index": 9, "type": "BOOLEAN" }, { "index": 10, "type": "date" }, { "index": 11, "type": "date" } ], "fieldDelimiter": "\t" } }, "writer": { "name": "hdfswriter", "parameter": { "defaultFS": "hdfs://xxx:port", "fileType": "orc", "path": "/user/hive/warehouse/writerorc.db/orcfull", "fileName": "xxxx", "column": [ { "name": "col1", "type": "TINYINT" }, { "name": "col2", "type": "SMALLINT" }, { "name": "col3", "type": "INT" }, { "name": "col4", "type": "BIGINT" }, { "name": "col5", "type": "FLOAT" }, { "name": "col6", "type": "DOUBLE" }, { "name": "col7", "type": "STRING" }, { "name": "col8", "type": "VARCHAR" }, { "name": "col9", "type": "CHAR" }, { "name": "col10", "type": "BOOLEAN" }, { "name": "col11", "type": "date" }, { "name": "col12", "type": "TIMESTAMP" } ], "writeMode": "append", "fieldDelimiter": "\t", "compress": "NONE" } } } ] } }3. 核心配置解析
下面逐段分析这两个脚本中的关键配置项,帮助读者理解每个参数的作用。
3.1 Job 与 Setting 配置
Job 是整个任务的根节点,Setting 用于配置任务的全局参数。这里的 speed.channel 表示并发通道数,设置为 3 意味着 DataX 会启动 3 个并发通道来读取和写入数据,从而提升同步效率。在写入 Hive 的脚本中,channel 设置为 2,表示使用 2 个并发通道。
3.2 Reader 配置
读取 Hive 时使用 hdfsreader 插件,用于读取 HDFS 上的文件。关键参数说明如下:
- path:Hive 表在 HDFS 上的存储路径,这里使用通配符
*匹配该目录下的所有文件。 - defaultFS:HDFS 的 NameNode 地址,格式为
hdfs://ip:port,需要替换为实际地址。 - fileType:文件类型,这里设置为 orc,表示读取 ORC 格式文件。
- encoding:文件编码,这里设置为 UTF-8。
- fieldDelimiter:字段分隔符,这里设置为逗号。
写入 Hive 时使用 txtfilereader 插件,用于读取本地文本文件。关键参数说明如下:
- path:本地文件的路径,这里是一个数组,可以配置多个文件路径。
- encoding:文件编码,这里设置为 UTF-8。
- column:定义从文本文件中读取的字段,通过 index 指定列位置,type 指定数据类型。
- fieldDelimiter:字段分隔符,这里设置为 Tab 制表符
\t。
3.3 Column 字段映射
Column 数组定义了如何从源文件中读取字段。这里展示了两种字段定义方式:
- 按索引读取:通过 index 指定字段在文件中的位置,并指定 type 为对应的数据类型。例如第一条配置表示读取第 0 列,类型为 long。
- 常量字段:不指定 index,而是通过 value 直接指定一个常量值。例如第三条配置表示每一行都会输出字符串 hello。
这种灵活的字段配置方式,让 DataX 可以在同步过程中插入常量列,或者跳过不需要的字段。
在写入 Hive 的脚本中,hdfswriter 的 column 数组定义了目标表的字段名和类型。这里展示了 Hive 中常见的多种数据类型映射:
- 整数类型:TINYINT、SMALLINT、INT、BIGINT 分别对应 Hive 中的不同整数精度。
- 浮点类型:FLOAT 和 DOUBLE 用于存储小数。
- 字符串类型:STRING、VARCHAR、CHAR 用于存储不同长度的文本。
- 其他类型:BOOLEAN 存储布尔值,date 存储日期,TIMESTAMP 存储时间戳。
3.4 Writer 配置
读取 Hive 的脚本中,Writer 使用 streamwriter 插件,用于将数据输出到控制台。这里的 print 参数设置为 true,表示在控制台打印读取到的数据,方便调试和验证。
写入 Hive 的脚本中,Writer 使用 hdfswriter 插件,用于将数据写入 HDFS 上的 ORC 文件。关键参数说明如下:
- defaultFS:HDFS 的 NameNode 地址,需要替换为实际地址。
- fileType:写入的文件类型,这里设置为 orc。
- path:Hive 表在 HDFS 上的存储路径,即目标表的仓库目录。
- fileName:写入文件的名称前缀。
- writeMode:写入模式,这里设置为 append,表示追加写入。
- fieldDelimiter:字段分隔符,这里设置为 Tab 制表符
\t。 - compress:压缩方式,这里设置为 NONE,表示不压缩。
4. 运行与验证
将上述脚本保存为 JSON 文件,然后通过 DataX 命令行工具执行:
python datax.py /path/to/job.json执行成功后,控制台会打印出从 Hive 表读取的每一行数据。由于配置了 3 个并发通道,数据会按照通道数被并行读取和输出。
对于写入 Hive 的脚本,执行成功后,数据会被写入到 HDFS 上指定的 ORC 文件目录中。可以通过 Hive 查询验证写入结果,例如:
SELECT * FROM writerorc.orcfull;如果数据正确写入,查询结果应该与本地文本文件中的内容一致。
5. 常见问题与注意事项
- defaultFS 配置:必须替换为实际可访问的 HDFS NameNode 地址,否则任务会报连接错误。
- path 通配符:使用
*可以匹配目录下的所有文件,但如果目录下有子目录,可能需要调整匹配规则。 - 字段类型匹配:index 对应的字段类型必须与 Hive 表中的实际类型一致,否则可能出现类型转换错误。
- ORC 文件支持:hdfsreader 对 ORC 格式的支持依赖于 DataX 版本,建议使用较新版本以获得更好的兼容性。
- 字段顺序对应:写入 Hive 时,txtfilereader 的 column 顺序必须与 hdfswriter 的 column 顺序一一对应,否则数据会错位。
- 类型大小写:hdfswriter 中的类型如 TINYINT、STRING 等建议使用大写,与 Hive 的类型定义保持一致。
- writeMode 选择:append 模式会追加写入,如果目标目录已有数据,需要注意是否会重复写入。
- compress 配置:如果 Hive 表设置了压缩属性,建议在 hdfswriter 中配置对应的 compress 参数,避免数据格式不匹配。
6. 总结
本文通过两个完整的 DataX 脚本,演示了如何使用 HDFS Reader 读取 Hive 的 ORC 表数据,并通过 Stream Writer 输出到控制台,以及如何使用 txtfilereader 读取本地文本文件并通过 hdfswriter 写入 Hive 的 ORC 表。理解 reader 的 path、defaultFS、column 等核心配置,以及 writer 的 fileType、writeMode、compress 等参数,是编写 DataX 任务的关键。读者可以根据实际业务需求,灵活组合不同的 Reader 和 Writer 插件,实现数据的双向同步。