本文為您介紹YARN-4946引入缺陷的影響範圍以及相應的修複方案。
背景資訊
YARN-4946引入缺陷,YARN ResourceManager刪除歷史應用作業時增加了日誌收集已完成的必要條件,但日誌收集的狀態沒有保留到ResourceManager State Store中,所以重啟後ResourceManager載入的歷史應用都是未完成狀態,無法被ResourceManager自動刪除掉,造成application在ResourceManager中堆積。這部分應用達到上限(相關配置為${yarn.resourcemanager.state-store.max-completed-applications} 或${yarn.resourcemanager.max-completed-applications},預設值為10000)之後,會影響ResourceManager的調度。
具體缺陷引入的Issue為YARN-4946,詳情請參見YARN-4946。
通過revert方式修複該缺陷的Issue為YARN-9571,詳情請參見YARN-9571。
缺陷影響
- 缺陷影響的組件:Hadoop YARN(開啟了服務高可用,並且添加了Zookeeper服務)。
- 缺陷層級:嚴重,建議修複,叢集長時間運行重啟後會導致叢集不可用。
- 缺陷發生現象:ResourceManager日誌一直列印“Application should be expired, max number of completed apps kept in memory met: maxCompletedAppsInMemory = 10000, but not removing app XXX from memory as log aggregation have not finished yet.”,導致YARN ResourceManager不可用,或者出現ResourceManager重啟之後長時間停用情況。
缺陷修複方案
您需要將E-MapReduce叢集中包含缺陷的Hadoop YARN ResourceManager的JAR包替換掉,然後重啟ResourceManager服務,重啟服務時先處理Standby ResourceManager,再處理Active ResourceManager。
該修複方案:
- 適用於EMR的4.6.0、4.7.0、4.8.0、4.9.0、5.1.0、5.2.0和5.2.1版本。說明 對應Hadoop的3.2.1版本。
- 執行該修複方案後,需要重啟對應的組件。重啟組件可能會導致作業失敗,所以建議業務低峰期時執行。
修複流程
按照先處理Standby ResourceManager,再處理Active ResourceManager的順序,通過JAR包替換的方式修複ResourceManager組件缺陷。
重要
- 替換過程中,重啟一個ResourceManager待正常運行之後再重啟另外一個ResoureManager。
- 如果叢集沒有開啟高可用,則無需執行該修複流程。
- 單擊hadoop-yarn-server-resourcemanager-3.2.1.jar下載YARN ResourceManager JAR包。
- 登入EMR叢集的Master節點,將下載好的JAR包放在Hadoop的軟體安裝目錄下。本樣本是在/usr/lib/hadoop-current/share/hadoop/yarn/目錄。
- 備份舊的JAR包,並將新包拷貝到相應位置。
mv $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-server-resourcemanager-3.2.1.jar /tmp/ cp hadoop-yarn-server-resourcemanager-3.2.1.jar $HADOOP_HOME/share/hadoop/yarn/命令中的$HADOOP_HOME為Hadoop的安裝目錄。本文樣本中Hadoop的安裝目錄為/usr/lib/hadoop-current。
- 重啟YARN ResourceManager服務。觀察ResourceManager重啟情況,如果重啟之後ResourceManager日誌不再提示“but not removing app XXX from memory as log aggregation have not finished yet.”的問題,並且作業可以正常提交,則說明修複成功。
- 在控制台尋找Active ResourceManager,重啟YARN ResourceManager服務。
復原流程
如果修複過程中遇到問題需要復原,則可以執行以下命令,使用備份路徑下的舊包替換掉補丁包,再重啟該節點上的YARN ResourceManager。
cp /tmp/hadoop-yarn-server-resourcemanager-3.2.1.jar $HADOOP_HOME/share/hadoop/yarn/