DataX 实战:使用 HDFS Reader 读取 Hive ORC 表并输出到 Stream

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 插件,实现数据的双向同步。

相关推荐
yumgpkpm2 小时前
CDP 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比
大数据·hive·hadoop·postgresql·zookeeper·spark·hbase
计算机毕业编程指导师3 小时前
【计算机大数据毕业设计选题】基于Hadoop+Spark的人工智能社交媒体情绪数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·人工智能·hadoop·计算机·毕业设计·课程设计·社交媒体
yumgpkpm3 小时前
(CDH 7)CDP Private Cloud Base 7.3.1 → Acceldata ODP 3.3.6.4 引擎迁移风险评估表
服务器·人工智能·hadoop·python·华为·zookeeper·hbase
计算机毕业编程指导师3 小时前
【计算机毕设】基于Hadoop的人口统计特征与肥胖风险关联分析的数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·数据分析·课程设计·肥胖风险
计算机毕业编程指导师3 小时前
【计算机毕业设计选题】基于Hadoop+Spark的乳腺癌数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
hadoop·python·spark·毕业设计·课程设计·乳腺癌·计算机毕设
yumgpkpm9 小时前
Acceldata ODP 3.3.6.4 vs CDP Private Cloud Base 7.3.2 对比
大数据·运维·服务器·hadoop·华为·zookeeper·hbase
yumgpkpm1 天前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera
sunxunyong1 天前
hs2偶发连接失败问题处理
hadoop
泡干脆面就番茄1 天前
HDFS读写流程与MapReduce原理深度解析(面试高频考点)
hdfs·面试·mapreduce