問題背景:
最近在使用海豚調(diào)度DolphinScheduler的Datax組件時,遇到這么一個問題:之前給客戶使用海豚做的離線數(shù)倉的分層搭建,一直都運行好好的,過了個元旦,這幾天突然在數(shù)倉做任務時報錯,具體報錯信息如下:
問題一:datax讀取hive分區(qū)表時,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 - 您即將讀取的文件數(shù)為: [0], 列表為: [] Code:[HdfsReader-08], Description:[您嘗試讀取的文件目錄為空.]. - 未能找到 待讀取的文件,請確認您的配置項 path:具體路徑? /user/hive/warehouse/dws.db/dws_index_business_xzkh/dt_date=2024-01-02
錯誤分析:
由于上層數(shù)據(jù)處理邏輯沒有生成任何數(shù)據(jù)導致未生成任何目錄和文件(如果上層 邏輯有自動創(chuàng)建目錄,則會出現(xiàn)該問題)
問題很簡單,因為該分區(qū)下沒有數(shù)據(jù)文件所以報錯。
這個解決也很容易。
1.當時想的是在shell里判斷分區(qū)路徑是否存在 然后hdfs dfs -ls /path |wc -l 看文件個數(shù)是否>0
? ?后來發(fā)現(xiàn)這種不是很可取。
2.當時就覺得這種判斷不太對,以前其他reader的時候怎么不見報錯,hdfsReader就報錯是吧。
? ?哪里報錯丟異常 我改成 warn就好了。
問題解決
找到報錯點
處理方法一:
那全部原因就是 emptyDirIsExecption 再看
/**emptyDirIsExecption ?默認值為true,當指定為false,空目錄任務會返回成功,同步記錄數(shù)為0**/
private Boolean emptyDirIsExecption=null;
再看,這里就是很清楚了
emptyDirIsExecption = this.readerOriginConfig.getBool(Key.EMPTY_DIR_IS_EXECPTION, true);
?我們設置在json里設置 emptyDirIsExecption=false即可。
根據(jù)網(wǎng)上的這個方法我沒改成,只能繼續(xù)研究源碼。
處理方法二:修改源碼,最簡單的辦法就是把throw的異常,僅用LOG.warn打印出來即可。
將原有的拋出異常修改為打印錯誤記錄終止本次調(diào)度任務(結果記為 成功避免后續(xù)任務正常進行,具體該如何處理需要根據(jù)具體業(yè)務決定),修改的 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文件打到包里),如果海豚調(diào)度搭建的是集群,請將集群中的都修改了,不用重啟海豚直接執(zhí)行任務就行。
問題二:datax讀取hive分區(qū)表時,datax-hdfsReader 讀取目錄不存在報錯
問題描述:
DataX 組件讀取的目錄不存在導致調(diào)度任務報錯,錯誤信息截圖如下:
關鍵信息:
ERROR HdfsReader$Job - 無法讀取路徑[具體路徑] 下的所有文件,請確認您的配 置項 fs.defaultFS, path 的值是否正確,是否有讀寫權限,網(wǎng)絡是否已斷開! java.io.FileNotFoundException: File 具體路徑 does not exist.
錯誤分析:
由于上層數(shù)據(jù)處理邏輯沒有生成任何數(shù)據(jù)導致未生成表分區(qū)目錄。
問題解決:
修改源碼,在目錄讀取前做判斷如果目錄不存在打印系統(tǒng)錯誤日志并終止本次調(diào) 度任務(結果記為成功避免后續(xù)任務正常進行,具體該如何處理需要根據(jù)具體業(yè)務決定), 修改的 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文件打到包里),如果海豚調(diào)度搭建的是集群,請將集群中的都修改了,不用重啟海豚直接執(zhí)行任務就行。
這里要說一下,我們改源碼請找自己對應版本的源碼,別找錯了
【DATAX】datax讀取hive分區(qū)表時,空分區(qū)任務報錯問題解決_datax hdfdsreader 讀 hive分區(qū)表
【DataX】Dolphinscheduler調(diào)度Datax任務讀取Hive分區(qū)表案例_目前支持orc,sequence,rcfile,text,csv五種格式的文件,請檢查您文件類型和文
最簡單dophinscheduler 集成datax步驟_dolphinescheduler datax
Dolphinscheduler配置Datax踩坑記錄_dolphinscheduler datax
datax-hdfsReader空目錄報錯_datax hdfsreader文章來源:http://www.zghlxwxcb.cn/news/detail-793626.html
gitee的代碼傳送門:https://gitee.com/mirrors_alibaba/DataX文章來源地址http://www.zghlxwxcb.cn/news/detail-793626.html
到了這里,關于【DolphinScheduler】datax讀取hive分區(qū)表時,空分區(qū)、分區(qū)無數(shù)據(jù)任務報錯問題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!