1. ?背景介紹
在Hadoop分支YARN中,當用戶提交應用程序后(提交到ResourceManager上),ResourceManager首先要做的是為該應用程序申請資源以啟動它的ApplicationMaster,而ApplicationMaster啟動后,它(ApplicationMaster)負責應用程序內部任務的分解,監控、容錯等。對于每個應用程序,由于只有一個ApplicationMaster,因此ApplicationMaster存在單點故障問題,一旦ApplicationMaster死掉,則整個應用程序可能會運行失敗。當ResourceManager探測到ApplicationMaster運行失敗(通過心跳超時機制)后,它會嘗試在另外一個節點上重新啟動該ApplicationMaster,通常而言,ApplicationMaster重啟后,會恢復之前的運行狀態(前提是ApplicationMaster上次死掉之前會記錄一些日志在HDFS上),當然,這是ApplicationMaster自己的事情,ResourceManager無權干涉,ResourceManager要做的只是發現ApplicationMaster死亡后,重新為它申請資源在另外一個節點上啟動。而本文介紹的這個特性則是如何指定每個應用程序ApplicationMaster的重試次數。
在2.1.0-beta版本之前,所有應用程序的ApplicationMaster重試次數是均是由ResourceManager決定的,管理員可通過配置參數yarn.resourcemanager.am.max-retries配置每個ApplicationMaster的重試次數,這個配置參數值適用于所有的應用程序,不可單獨對單個應用程序定制化,而這個改進正是為了解決這個問題。
2. 解決思路
首先需要明確的是,這個改進的目的是,讓用戶可以為自己的應用程序定制ApplicationMaster的重試次數。
其次,這個重試次數將被兩個組件用到,分別是ResourceManager和ApplicationMaster,其中ResourceManager用于決定,是否對失敗的ApplicationMaster進行重試;ApplicationMaster用于決定,是否需要恢復上次運行時的狀態(從第二次開始恢復),以從斷點開始計算。
通常而言,有點經驗的人,可能認為可以這樣解決問題:將用戶設置的值放到Configuration中,通過job.xml傳遞到ResourceManager和ApplicationMaster上,這樣改動是最小的。但是很遺憾,客戶端傳遞的job.xml只有ApplicationMaster會讀取,而ResourceManager不會。
YARN 2.1.0-beta版本的解決方案如下:
(1) 客戶端設置重試次數后,該值將被寫入ProtocolBuffer對象ApplicationSubmissionContextProto中的新增字段maxAppAttempts中(在hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto中定義);
(2) 客戶端提交應用程序后,maxAppAttempts值會通過RPC函數傳遞給ResourceManager;
(3)ResourceManager判斷maxAppAttempts是否為0,如果為0,則改為ResourceManager內部已經設置好全局值,由屬性arn.resourcemanager.am.max-attempts指定,默認為1;
(4)ResourceManager為ApplicationMaster申請資源后,與對應的節點通信啟動ApplicationMaster,啟動之前,會將maxAppAttempts值通過環境變量“MAX_APP_ATTEMPTS”傳遞給它
(5) ApplicationMaster在main函數中讀取環境變量MAX_APP_ATTEMPTS,然后開始執行。
這樣,各個應用程序可根據實際需要單獨向用戶提供可配置AM嘗試次數的參數,比如MapReduce的參數是mapreduce.am.max-attempts,用戶設置了該參數后,參數值會經過以上5個步驟進行傳遞。
3. ?我們學到了什么
(1)善用環境變量傳遞信息,環境變量可由父進程傳遞給子進程;
(2)在YARN中,代碼改動通常是鏈式的,也就是說,需要依次改動幾個組件,比如該例子中,需要一次改動client、ResourceManager和ApplicationMaster的代碼,改動代碼之前,要規劃好修改方案和估算好代碼的改動幅度;
(3)當需要添加一種新的ApplicationMaster相關的可配置參數時,可仿照這個jira實現完成,比如,假設讓ApplicationMaster支持多種容錯機制(現在不支持),其中一種是ApplicationMaster死掉后,盡量嘗試在原節點重啟(通常,ApplicationMaster中運行的是服務時,需要這么做),而這樣改動之后,需要用戶指定應用程序采用的容錯機制類別。
原創文章,轉載請注明: 轉載自董的博客
本文鏈接地址: http://dongxicheng.org/mapreduce-nextgen/hadoop-jira-yarn-378/
作者:Dong,作者介紹:http://dongxicheng.org/about/
本博客的文章集合:http://dongxicheng.org/recommend/
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com