大數據Hive任務異常快速排查方案
背景
女媧雲平臺每天產生的業務數據都會由大數據部門採集清洗並呈現數據報表,標籤數據等。大數據平臺任務調度框架使用開源項目Azkaban,其簡單易用的特點廣受中小團隊喜愛,服務器依託於騰訊雲EMR,在數據清洗層,對數據量較大,實時性要求不高的離線任務使用Hive計算 + HDFS存儲的經典組合,展現層結果數據存儲於Clickhouse,保證了海量數據的存儲與計算,對一些數據量較小且實時性要求高的業務使用Presto即時計算框架+Metabase開源BI快速呈現。數以百計的離線任務按小時、天等週期不間斷運行,中間發生異常後需要快速定位並解決,不能影響業務方使用,本文結合數據開發日常經驗提供快速解決方案。
注:以下示例爲UAT測試環境
1、發現異常
- 查看azkaban任務運行記錄,發現任務運行卡頓,狀態長時間在running中(圖中是強制中止後轉爲Killed狀態)
- 新啓動的hive任務無法運行,一直在等待調度
2、定位異常
2.1 查看錯誤日誌
- 內存不足異常
java.lang.OutOfMemoryError: Java heap space
- 動態分區未設置異常
Error while compiling statement: FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict
- ParseException一般爲SQL語法問題
Error while compiling statement: FAILED: ParseException line 1:17
2.2 查看EMR機器資源是否異常
2.3 查看YARN內存、cpu核是否充足
Memory Total:總可使用內存
Memory Used: 已使用內存,發現異常時若看到這裏的值與Memory Total值一樣,說明YARN內存不足,任務堵塞
Vcores Total:總可使用cpu核數
Vcores Used:已使用cpu核數,發現異常時若看到這裏的值與Vcores Total值一樣,說明YARN核數不足,任務堵塞
3、解決異常
3.1 常見異常
- SQL語法錯誤
開發時在測試環境多跑幾遍,藉助HUE可視化工具、hive終端等多測試能否正常運行
- 任務內存不足
SET mapred.child.java.opts=-Xms1024M,同時對Map和Reduce端設置,任務啓動默認申請內存200M,報內存不足異常時可以在默認值基礎上提高設置,再調試任務能否正常運行
- 沒設置分區參數,設置參數解決
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions = 3000;
SET hive.exec.max.dynamic.partitions.pernode=3000;
3.2 EMR機器內存不足
先查看同機器是否還有其他應用佔用內存過高,如果沒有隻能提高機器配置,通過觀察分析EMR機器不止有Hive離線程序,還有Presto即席查詢程序在運行,最高會佔用到30~40%機器內存(JVM機制導致),這時候會選擇把presto重啓一下釋放佔用內存
3.3 YARN資源不足
-
臨時解決方案,殺死所有運行堵塞的任務
- for i in `yarn application -list | awk '{print $1}' | grep application_`; do yarn application -kill $i; done
-
排查是否有大任務佔用了大量資源,大任務是否有數據發散,是否全量數據更新任務,是的話能否改成增量更新任務,針對性逐個優化
-
實在不行就提高機器內存配置
總結
大數據部門目前可支配機器內存170G左右,Hive單表最大量2~3億,同一週期內運行任務數較多,有時會發生YARN資源內存不足、機器內存不足、機器磁盤不足、任務堵塞等線上問題,快速解決線上問題的同時,要從長遠考慮治標治本的問題,任務編排是否合理、任務調度頻率是否要這麼快、開發流程是否有漏洞、修復後數據質量是否受到影響,綜合考慮機器成本和任務資源利用最大化之間的平衡。