1. 程式人生 > >YARN-異常大全-《每日五分鐘搞定大數據》

YARN-異常大全-《每日五分鐘搞定大數據》

管理 cat love guarantee 解決 code 出現 shu sources

#問題描述:NodeManager1 cpu負載飆高,進程還在但是不再向ResourceManager發送心跳,不斷重復下文2的動作。心跳停止一段時間後會重連上RM但是cpu仍然很高,再過一段時間心跳再停,一直循環。

#節點管理器的日誌解析1.localizing:容器開始從HDFS下載資源,HDFS文件的狀態從INIT變成下載。

 2018年8月25日16:15:38592信息org.apache.hadoop .yarn.server.nodemanager.containermanager.localizer.LocalizedResource:資源HDFS://mycluster/user/hdfs/.staging/application_1444990016246_29569/libjars/avro-mapred-hadoop2.jar轉變從INIT於下載```
 2.container在本地化過程中被停止或者殺死,導致HDFS文件狀態保持為下載。  非零的引用計數表示當前沒有其他容器在使用這個資源,說明這個資源將無法刪除。

2018-08-25 19:15:38,592 ERROR org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalResourcesTrackerImpl: Attempt to remove resource: { { hdfs://mycluster/user/hdfs/.staging/application_1444990016246_29569/libjars/avro-mapred-hadoop2.jar, 1448139497492, FILE, null },pending,[],920074451410033,DOWNLOADING} with non-zero refcount

3.任務已經被kill所以報了CancellationException

2018-08-25 19:25:34,592 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService: {...}failed;
java.util.concurrent.CancellationException

4.一段時間後狀態從DOWNLOADING轉為FAILED,hdfs資源可以刪除

2018-08-25 20:15:38,592 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalizedResource:Resource hdfs://mycluster/user/hdfs/.staging/application_1444990016246_29569/libjars/avro-mapred -hadoop2.jar( - > /數據/納米本地-DIR / usercache / hadoop的/ filecache / 5432524 /阿夫羅-mapred-hadoop2.jar)從下載到FAILED轉換```

5.刪除本地緩存的文件(可能已損壞)

``
2018-08-25 19:15:38,592 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalResourcesTrackerImpl:Removed / data / nm-local-dir / usercache / hadoop / filecache / 5432524 / avro-mapred-hadoop2.jar來自本地化緩存```
6.請求的資源不在緩存中,將重新請求

2018-08-25 19:15:38,592 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.LocalResourcesTrackerImpl:Container container_152345432_4324_3_4324234 sent RELEASE event on a resource request {hdfs://mycluster/user/hdfs/.staging/application_1444990016246_29569/libjars/avro-mapred-hadoop2.jar,,,} not present in cache

原因總結

container被stop,原因可能是與外部組件rpc失敗,或者任務被人為kill等等異常。導致hdfs資源異常無法刪除而container又會一直嘗試去刪除

解決辦法

1.Low的辦法:手動刪除hdfs中無法刪除的文件(難實現,不知道刪那些文件且很多時操作麻煩)

2.高端的辦法:異常的位置
LocalResourcesTrackerImpl(line339)

public boolean remove(LocalizedResource rem, DeletionService delService) {
// current synchronization guaranteed by crude RLS event for cleanup
   LocalizedResource rsrc = localrsrc.get(rem.getRequest());
   if (null == rsrc) {
     LOG.error("Attempt to remove absent resource: " + rem.getRequest()
         + " from " + getUser());
     return true;
   }
   if (rsrc.getRefCount() > 0
       || ResourceState.DOWNLOADING.equals(rsrc.getState()) || rsrc != rem) {
     // internal error
     LOG.error("Attempt to remove resource: " + rsrc
         + " with non-zero refcount");
     return false;
   } else { // ResourceState is LOCALIZED or INIT
     localrsrc.remove(rem.getRequest());
     if (ResourceState.LOCALIZED.equals(rsrc.getState())) {
       delService.delete(getUser(), getPathToDelete(rsrc.getLocalPath()));
     }
     decrementFileCountForLocalCacheDirectory(rem.getRequest(), rsrc);
     LOG.info("Removed " + rsrc.getLocalPath() + " from localized cache");
     return true;
   }
 }

ResourceState.DOWNLOADING.equals(rsrc.getState())
文件狀態為DOWNLOADING則報錯,可在源碼中刪除這個條件。
參考添加補丁:
https://issues.apache.org/jira/browse/YARN-2902
https://issues.apache.org/jira/secure/attachment/12685562/YARN-2902.patch

3.無敵的辦法:重啟大法。。。重啟nodemanager,spark等任務會自動failover,不會影響線上的業務

總結:

  這個問題和資源分配或者container的資源占用沒有關系,因為是nodemanager的cpu飆高,而不是container。產生這個問題的原因是在剛提交任務的時候,container開始初始化並且開始從hdfs拉依賴資源到本地,此時任務掛了或者container掛了(人為的或者超時等原因),並且此時沒有其他container在使用這個資源,則這個資源就會保持在DownLoading狀態,則會報上面第二個錯誤。正常情況下不用理會這個報錯,一段時間後會把DownLoading改為Failed,然後直接將資源刪除。但是我這裏觀察到的情況是DownLoading狀態的文件太多,狀態轉換速度非常慢,甚至一直都無法轉換成功,導致無法刪除,日誌裏出現大量類似2的報錯且把cpu拉得特別高偶爾出現nodemanager假死的情況,最終的解決辦法是重啟。

評論不能及時回復可直接加公眾號提問或交流,知無不答,謝謝 。
技術分享圖片

YARN-異常大全-《每日五分鐘搞定大數據》