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

相关推荐
测试盐39 分钟前
spark作业日志定位过程
java·hadoop·spark
步行cgn2 小时前
为什么既要 web.xml 又要 springmvc.xml?能不能只配一个?
xml·前端·hive
NiceZack1 天前
Hadoop 部署全流程教程:从新装 CentOS 到伪分布式与完全分布式
hadoop·分布式·centos
@小匠1 天前
Flink + Iceberg 批量失败复盘:一次超时如何变成 Hive Metastore 锁泄漏
大数据·hive·flink
skywalk81632 天前
hive —— 多机 AI Agent 协同的任务总线:分布式,多节点同时运行,保障不会宕机
人工智能·hive·分布式
棣廷3 天前
初识Hive(2)
数据仓库·hive·hadoop
skywalk81633 天前
deepseek对skywalk163/hive 和hivecommons/hive 两个多机AI Agent任务调度项目的对比
人工智能·hive·agent
father_12274 天前
【ambari管理下hdp2.6.5升级hive1.2.1-2.1.0-2.3.3】
hive·hadoop·ambari
magic_kid_20104 天前
HDFS 故障复盘:千万级 block 导致 FBR 超过 128 MiB,DataNode 被判定为 dead
大数据·hadoop·hdfs·hadoop 故障
小刘在重生~4 天前
Servlet_day2 (上)|Servlet 整合 JDBC|请求转发 forward|Request 作用域
hive·hadoop·servlet