【DolphinScheduler】datax读取hive分区表时,空分区、分区无数据任务报错问题解决

本文详细描述了在使用DataX组件与DolphinScheduler配合构建离线数仓时遇到的两个问题:读取空目录和目录不存在的报错。作者提供了问题分析、解决方法,包括设置emptyDirIsExecption为false以及修改源码处理异常,强调了针对具体业务场景调整配置的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景:

最近在使用海豚调度DolphinScheduler的Datax组件时,遇到这么一个问题:之前给客户使用海豚做的离线数仓的分层搭建,一直都运行好好的,过了个元旦,这几天突然在数仓做任务时报错,具体报错信息如下:

问题一:datax读取hive分区表时,datax-hdfsReader 读取空目录报错

问题描述:

com.alibaba.datax.common.exception.DataXException: Code:[HdfsReader-08], Description:[您尝试读取的文件目录为空.].  - 未能找到待读取的文件,请确认您的配置项path: /user/hive/warehouse/dws.db/dws_index_business_xzkh/dt_date=2024-01-02

关键信息:

INFO HdfsReader$Job - 您即将读取的文件数为: [0], 列表为: [] Code:[HdfsReader-08], Description:[您尝试读取的文件目录为空.]. - 未能找到 待读取的文件,请确认您的配置项 path:具体路径  /user/hive/warehouse/dws.db/dws_index_business_xzkh/dt_date=2024-01-02

错误分析:

由于上层数据处理逻辑没有生成任何数据导致未生成任何目录和文件(如果上层 逻辑有自动创建目录,则会出现该问题)

问题很简单,因为该分区下没有数据文件所以报错。

这个解决也很容易。

1.当时想的是在shell里判断分区路径是否存在 然后hdfs dfs -ls /path |wc -l 看文件个数是否>0

   后来发现这种不是很可取。

2.当时就觉得这种判断不太对,以前其他reader的时候怎么不见报错,hdfsReader就报错是吧。

   哪里报错丢异常 我改成 warn就好了。

问题解决

找到报错点

处理方法一:

那全部原因就是 emptyDirIsExecption 再看

/**emptyDirIsExecption  默认值为true,当指定为false,空目录任务会返回成功,同步记录数为0**/
private Boolean emptyDirIsExecption=null;
再看,这里就是很清楚了

emptyDirIsExecption = this.readerOriginConfig.getBool(Key.EMPTY_DIR_IS_EXECPTION, true);
 我们设置在json里设置 emptyDirIsExecption=false即可。

根据网上的这个方法我没改成,只能继续研究源码。

处理方法二:修改源码,最简单的办法就是把throw的异常,仅用LOG.warn打印出来即可。

将原有的抛出异常修改为打印错误记录终止本次调度任务(结果记为 成功避免后续任务正常进行,具体该如何处理需要根据具体业务决定),修改的 Java 文件为 位于 hdfsreader 工程下的 com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader。  

        public List<Configuration> split(int adviceNumber) {

            LOG.info("split() begin...");
            List<Configuration> readerSplitConfigs = new ArrayList<Configuration>();
            // warn:每个slice拖且仅拖一个文件,
            // int splitNumber = adviceNumber;
            int splitNumber = this.sourceFiles.size();
            if (0 == splitNumber) {
                // throw DataXException.asDataXException(HdfsReaderErrorCode.EMPTY_DIR_EXCEPTION,
                //        String.format("未能找到待读取的文件,请确认您的配置项path: %s", this.readerOriginConfig.getString(Key.PATH)));
                //异常处理逻辑修改
                LOG.warn(String.format("未能找到待读取的文件,请确认您的配置项path: %s", this.readerOriginConfig.getString(Key.PATH)));
                LOG.info("split() end");
                LOG.info("Task exited with return code 0");
                System.exit(0);
            }

重新打包后,替换安装目录下 /data/datax/plugin/reader/hdfsreader 下的 hdfsreader-0.0.1-SNAPSHOT.jar 包。(记得如果是ha,还要提前将hdfs-site和core-site文件打到包里),如果海豚调度搭建的是集群,请将集群中的都修改了,不用重启海豚直接执行任务就行。

问题二:datax读取hive分区表时,datax-hdfsReader 读取目录不存在报错

问题描述:

DataX 组件读取的目录不存在导致调度任务报错,错误信息截图如下:

关键信息:

ERROR HdfsReader$Job - 无法读取路径[具体路径] 下的所有文件,请确认您的配 置项 fs.defaultFS, path 的值是否正确,是否有读写权限,网络是否已断开! java.io.FileNotFoundException: File 具体路径 does not exist.

错误分析:

由于上层数据处理逻辑没有生成任何数据导致未生成表分区目录。

问题解决:

修改源码,在目录读取前做判断如果目录不存在打印系统错误日志并终止本次调 度任务(结果记为成功避免后续任务正常进行,具体该如何处理需要根据具体业务决定), 修改的 Java 文件为位于 hdfsreader 工程下的 com.alibaba.datax.plugin.reader.hdfsreader. DFSUtil。

重新打包后,替换安装目录下 /data/datax/plugin/reader/hdfsreader 下的 hdfsreader-0.0.1-SNAPSHOT.jar 包。(记得如果是ha,还要提前将hdfs-site和core-site文件打到包里),如果海豚调度搭建的是集群,请将集群中的都修改了,不用重启海豚直接执行任务就行。

这里要说一下,我们改源码请找自己对应版本的源码,别找错了

【DATAX】datax读取hive分区表时,空分区任务报错问题解决_datax hdfdsreader 读 hive分区表

【DataX】Dolphinscheduler调度Datax任务读取Hive分区表案例_目前支持orc,sequence,rcfile,text,csv五种格式的文件,请检查您文件类型和文

最简单dophinscheduler 集成datax步骤_dolphinescheduler datax

Dolphinscheduler配置Datax踩坑记录_dolphinscheduler datax

datax-hdfsReader空目录报错_datax hdfsreader

gitee的代码传送门:https://gitee.com/mirrors_alibaba/DataX

### 数据同步方案概述 DataX 是阿里巴巴开源的一款异构数据源离线同步工具,支持多种数据库之间的数据传输。要实现 Hive 分区表中的数据同步到 MySQL 的场景,可以按照以下方式设计配置文件并完成任务。 #### 1. DataX 配置基础结构 DataX 使用 JSON 文件作为其核心配置文件,主要分为 `job` 和 `content` 两大部分。其中 `job` 定义了整体的任务属性,而 `content` 则描述具体的读取器 (`reader`) 和写入器 (`writer`) 设置[^1]。 #### 2. Reader 插件 (HiveReader) 对于 Hive 表的数据读取,需使用 `hive` 类型的 reader 插件。如果目标表是一个分区表,则需要通过动态参数来指定所需的分区信息[^3]。例如: ```json { "name": "hivereader", "parameter": { "defaultFS": "hdfs://nameservice1", "path": "/user/hive/warehouse/db_name/table_name/dt=${bizdate}", "fieldDelimiter": "\u0001", "column": [ {"name": "id", "type": "string"}, {"name": "name", "type": "string"} ], "fileFormat": "TEXTFILE" } } ``` 上述代码片段展示了如何设置路径以匹配特定日期(`${bizdate}`)下的分区目录,并定义字段分隔符以及列名列表。 #### 3. Writer 插件 (MysqlWriter) 为了将提取出来的数据加载至 MySQL 中,应选用 `mysql` writer 组件。此组件允许用户自定义 SQL 来控制插入行为,比如批量插入或者更新操作[^2]: ```json { "name": "streamwriter", "parameter": { "print": true, "connection": [{ "jdbcUrl": ["jdbc:mysql://localhost:3306/test"], "table": ["target_table"] }], "username":"root", "password":"your_password", "writeMode":"insert", "batchSize":10000, "preSql":[], "postSql":[] } } ``` 这里需要注意的是 `"jdbcUrl"` 应替换为目标数据库的实际连接字符串;同也要调整用户名密码等相关认证细节。 #### 4. 整合完整的JSON模板 最后一步就是把前面提到的所有要素组合起来形成最终可执行的 job.json 文件: ```json { "job": { "setting": {}, "content": [ { "reader": { ... }, // 如上所示的 hivereader 参数 "writer": { ... } // 如上所示的 mysqlwriter 参数 } ] } } ``` 运行该脚本前,请确认所有依赖环境已经搭建完毕,包括但限于 Hadoop/HDFS, Hive Metastore 及 Target Database(MySQL)[^1]. ### 注意事项 - 确保 source side(Hive)和 target side(MySQL)之间网络可达。 - 如果遇到性能瓶颈问题,考虑优化 batch size 或者启用并发模式。 - 对于大数据量迁移项目建议先做小规模测试验证流程无误后再扩大范围实施全量转移工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_81D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值