1. 引言
DataX 是阿里开源的数据同步工具,支持多种数据源之间的高效传输。在实际业务中,我们经常需要把 Hive 表中的数据同步到其他存储系统。本文以一个完整的 DataX 任务脚本为例,演示如何使用 HDFS Reader 读取 Hive 的 ORC 格式表,并通过 Stream Writer 将数据打印到控制台,帮助读者快速理解 DataX 的配置结构和字段映射方式。
2. 任务脚本概览
下面是一个完整的 DataX 任务 JSON 脚本,它从 Hive 仓库目录读取 ORC 文件,并将数据输出到控制台:
json
{
"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 表:
json
{
"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 命令行工具执行:
bash
python datax.py /path/to/job.json
执行成功后,控制台会打印出从 Hive 表读取的每一行数据。由于配置了 3 个并发通道,数据会按照通道数被并行读取和输出。
对于写入 Hive 的脚本,执行成功后,数据会被写入到 HDFS 上指定的 ORC 文件目录中。可以通过 Hive 查询验证写入结果,例如:
sql
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 插件,实现数据的双向同步。