首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Hive 寫入 Elasticsearch 報錯「File not found: reduce.xml」根因與解決

     編輯:程式設計疑難解答

錯誤現象

執行 Hive 插入數據到 Elasticsearch 任務時失敗,日誌顯示:

File not found: File does not exist: /tmp/hive/.../reduce.xml

No plan file found: hdfs://.../reduce.xml

根因分析

直接原因:Ubuntu 宿主機磁盤空間耗盡。

連鎖反應:

  1. MapReduce 作業在 /tmp 目錄生成中間文件(包括 reduce.xml 計劃文件)
  2. 磁盤滿導致文件寫入失敗或被系統清理進程誤刪
  3. TaskAttempt 尋找計劃文件失敗,拋出 FileNotFoundException
  4. NameNode 返回 INodeFile.valueOf 錯誤,堆疊追蹤顯示 HDFS 存取異常

解決方案

緊急處理

# 檢查磁盤使用
df -h

# 清理臨時文件
sudo rm -rf /tmp/hive/*
sudo rm -rf /tmp/hadoop/*

# 清理 HDFS 垃圾桶
hdfs dfs -expunge

# 重啟相關服務
systemctl restart hive-metastore hive-server2

長期優化

  • 調整 Hive 臨時目錄:在 hive-site.xml 配置 hive.exec.scratchdir 指向大容量分區
  • 啟用壓縮:設置 hive.exec.compress.intermediate=true 減少磁盤佔用
  • 限制並行度:降低 mapreduce.job.reduces 避免同時產生過多中間文件
  • 監控告警:部署磁盤使用率監控(如 Prometheus + Grafana),閾值 80% 告警
  • 定期清理:配置 cron 任務清理超時的 /tmp 文件

驗證修復

釋放空間後重新執行插入語句:

INSERT OVERWRITE TABLE doc SELECT s.id, s.name FROM user_f s;

任務應能正常完成,數據成功寫入 Elasticsearch。

避坑指南

  1. 生產環境嚴禁將 Hive/Hadoop 臨時目錄放在系統盤
  2. 預估中間數據量:通常為原始數據 2-3 倍,預留足夠緩衝
  3. 使用外部表(EXTERNAL TABLE)避免數據遷移時的額外拷貝
  4. 考慮使用 Spark SQL 替代 Hive on MR,減少磁盤中間文件依賴
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved