失敗類型
- 程序問題
- 進程崩潰
- 硬件問題
失敗處理
任務(wù)失敗
- 運行時異?;蛘逬VM退出都會報告給ApplicationMaster
- 通過心跳來檢查掛住的任務(wù)(timeout),會檢查多次(可配置)才判斷該任務(wù)是否失效
- 一個作業(yè)的任務(wù)失敗率超過配置,則認(rèn)為該作業(yè)失敗
- 失敗的任務(wù)或作業(yè)都會有ApplicationMaster重新運行
ApplicationMaster失敗
- ApplicationMaster定時發(fā)送心跳信號到ResourceManager,通常一旦ApplicationMaster失敗,則認(rèn)為失敗,但也可以通過配置多次后才失敗
- 一旦ApplicationMaster失敗,ResourceManager會啟動一個新的ApplicationMaster
- 新的ApplicationMaster負(fù)責(zé)恢復(fù)之前錯誤的ApplicationMaster的狀態(tài)(yarn.app.mapreduce.am.job.recovery.enable=true),這一步是通過將應(yīng)用運行狀態(tài)保存到共享的存儲上來實現(xiàn)的,ResourceManager不會負(fù)責(zé)任務(wù)狀態(tài)的保存和恢復(fù)
- Client也會定時向ApplicationMaster查詢進度和狀態(tài),一旦發(fā)現(xiàn)其失敗,則向ResouceManager詢問新的ApplicationMaster
NodeManager失敗
- NodeManager定時發(fā)送心跳到ResourceManager,如果超過一段時間沒有收到心跳消息,ResourceManager就會將其移除
- 任何運行在該NodeManager上的任務(wù)和ApplicationMaster都會在其他NodeManager上進行恢復(fù)
- 如果某個NodeManager失敗的次數(shù)太多,ApplicationMaster會將其加入黑名單(ResourceManager沒有),任務(wù)調(diào)度時不在其上運行任務(wù)
ResourceManager失敗
- 通過checkpoint機制,定時將其狀態(tài)保存到磁盤,然后失敗的時候,重新運行
- 通過zookeeper同步狀態(tài)和實現(xiàn)透明的HA
可以看出,一般的錯誤處理都是由當(dāng)前模塊的父模塊進行監(jiān)控(心跳)和恢復(fù)。而最頂端的模塊則通過定時保存、同步狀態(tài)和zookeeper來?實現(xiàn)HA
更多建議: