全部產品
Search
文件中心

:常見問題

更新時間:Jul 01, 2024

本文匯總了YARN使用時的常見問題。

叢集有狀態重啟包括哪些內容?

叢集有狀態重啟包括RM RestartNM Restart兩部分,ResourceManager(簡稱RM)負責維護應用級基礎資訊與狀態,NodeManager(簡稱NM)負責維護運行時的Container資訊與狀態,它們持續將相關狀態同步至外部儲存(Zookeeper、LevelDB和HDFS等),並在重啟後重新載入狀態自行恢複,保證叢集升級或重啟後應用自動回復,通常情況下可以做到應用無感知。

如何啟用RM HA?

您可以在EMR控制台YARN服務的配置頁簽,檢查或者配置以下參數啟用RM HA。

參數

描述

yarn.resourcemanager.ha.enabled

設定為true,表示開啟HA。

預設值為false。

yarn.resourcemanager.ha.automatic-failover.enabled

使用預設值true,表示啟用自動切換。

yarn.resourcemanager.ha.automatic-failover.embedded

使用預設值true,表示使用嵌入的自動切換方式。

yarn.resourcemanager.ha.curator-leader-elector.enabled

設定為true,表示使用curator組件。

預設值為false。

yarn.resourcemanager.ha.automatic-failover.zk-base-path

使用預設值/yarn-leader-electionleader-elector

如何配置熱更新?

重要

以下操作內容適用於Hadoop 3.2.0及後續版本。

  1. 開啟關鍵配置。

    您可以在EMR控制台YARN服務的配置頁簽,檢查或者配置以下參數。

    參數

    描述

    參數值(推薦)

    yarn.scheduler.configuration.store.class

    使用的備份存放區的類型。例如,設定為fs,表示使用FileSystem類型儲存。

    fs

    yarn.scheduler.configuration.max.version

    保留歷史版本的最大數量,超出自動清理。

    100

    yarn.scheduler.configuration.fs.path

    capacity-scheduler.xml檔案儲存體路徑。

    不存在儲存路徑時,則自動建立。不指定首碼時,則預設defaultFs的相對路徑。

    /yarn/<叢集名>/scheduler/conf

    重要

    將<叢集名>替換為叢集名稱以便區分,可能有多個YARN叢集對應同一分布式儲存的情況。

  2. 查看capacity-scheduler.xml配置。

    • 方式一(REST API):http://<rm-address>/ws/v1/cluster/scheduler-conf。

    • 方式二(HDFS檔案):${yarn.scheduler.configuration.fs.path}/capacity-scheduler.xml.<timestamp>,其中尾碼<timestamp>值最大的檔案是最新的設定檔。

  3. 更新配置。

    樣本:更新一個配置項yarn.scheduler.capacity.maximum-am-resource-percent,並刪除配置項yarn.scheduler.capacity.xxx,刪除某配置項只需去掉其Value值。

    curl -X PUT -H "Content-type: application/json" 'http://<rm-address>/ws/v1/cluster/scheduler-conf' -d '
    {
      "global-updates": [
        {
          "entry": [{
            "key":"yarn.scheduler.capacity.maximum-am-resource-percent",
            "value":"0.2"
          },{
            "key":"yarn.scheduler.capacity.xxx"
          }]
        }
      ]
    }'

如何處理Queue內應用程式指派不均?

重要

以下操作內容適用於Hadoop 2.8.0及後續版本。

Queue內部資源通常會被大作業佔據,小作業較難獲得資源,希望各作業能公平獲得資源。您可以通過以下步驟處理:

  1. 修改Queue配置yarn.scheduler.capacity.<queue-path>.ordering-policy,使其調度次序由fifo(預設值)改為fair

    說明

    FIFO Scheduler為先進先出調度器,Fair Scheduler為公平調度器。

    您還可以修改參數yarn.scheduler.capacity.<queue-path>.ordering-policy.fair.enable-size-based-weight,該參數預設值false,表示按used資源值從小到大排序,參數值為true時表示按照used或demand計算值從小到大排序。

  2. 開啟隊列內搶佔。

    隊列內搶佔常用參數如下表所示。

    參數

    描述

    參數值(推薦)

    yarn.resourcemanager.scheduler.monitor.enable

    搶佔功能總開關,在yarn-site.xml中配置,其餘參數是在capacity-scheduler.xml中配置。

    true

    yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.enabled

    隊列內搶佔開關(隊列間搶佔無開關,預設開啟)。

    true

    yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.preemption-order-policy

    搶佔策略優先考慮應用優先順序,預設值為userlimit_first。

    priority_first

    yarn.scheduler.capacity.<queue-path>.disable_preemption

    指定Queue不被搶佔,預設false。

    true表示不允許指定Queue資源被搶佔,子Queue未配置則繼承父Queue配置值。

    true

    yarn.scheduler.capacity.<queue-path>.intra-queue-preemption.disable_preemption

    指定Queue不開啟隊列內搶佔,預設值false。

    true表示禁用Queue內搶佔,子Queue未配置則繼承父Queue配置值。

    true

如何查看隊列資源使用方式?

要查看隊列資源使用方式,您可以在YARN WebUI頁面查看Used Capacity參數。Used Capacity參數表示該隊列已使用的資源占該隊列整體資源的百分比,分別計算Memory和vCores佔總體的比例,並選取最大值作為隊列整體資源使用的比例。具體查看操作如下:

  1. 訪問YARN UI,詳情請參見訪問連結與連接埠

  2. All Applications頁面,單擊目標作業的ID。

  3. 單擊Queue行的隊列。

    Application Queues地區,可以查看隊列資源使用方式。

    image.png

YARN服務元件.out日誌為何會大量堆積且無法自動清理?

  • 問題原因:Hadoop組件部分依賴庫使用Java Logging APIs來組建記錄檔記錄,不支援使用log4j配置的日誌輪轉。目前這些daemon組件的stderr輸出被重新導向到.out檔案中,沒有自動清理機制,長時間積累可能導致資料盤儲存空間被佔滿。

  • 處理方法:可以使用headtail命令結合日誌中產生的時間戳記資訊,來判斷是否由於Java Logging APIs產生的日誌導致儲存空間佔用過大。通常情況下,這些依賴庫產生的都是INFO層級日誌,不影響組件正常功能使用,但為了避免資料盤儲存空間被佔用,可以採取修改配置的方式禁用此類日誌的產生。

    例如,在最佳化TimelineServer組件以關閉jersey依賴庫的日誌產生時,操作步驟如下:

    1. 通過以下命令,監控YARN日誌路徑中與hadoop-timelineserver-相關的.out記錄檔。DataLake叢集的日誌路徑為/var/log/emr/yarn/,Hadoop叢集日誌路徑為/mnt/disk1/log/hadoop-yarn

      tail /var/log/emr/yarn/*-hadoop-timelineserver-*.out

      觀察到輸出日誌中包含由com.sun.jersey組件產生的記錄。

      image.png

    2. 為了禁止組件輸出Jersey庫的INFO層級日誌到.out 檔案,建立並配置一個檔案來關閉其日誌產生。在運行有TimelineServer組件的EMR節點上,可以通過執行以下命令以root許可權建立並編輯設定檔。

      sudo su root -c "echo 'com.sun.jersey.level = OFF' > $HADOOP_CONF_DIR/off-logging.properties"
    3. 在EMR控制台中YARN服務的配置頁面,尋找YARN_TIMELINESERVER_OPTS參數(Hadoop叢集為yarn_timelineserver_opts),並在此參數值後添加-Djava.util.logging.config.file=off-logging.properties,指定剛剛建立的設定檔位置。

      image

    4. 儲存上述配置更改後,重啟TimelineServer組件使新設定生效。持續觀察一段時間,如果TimelineServer組件正常啟動,並且.out日誌中不再出現任何與com.sun.jersey相關的日誌資訊,則說明關閉jersey依賴庫日誌的操作已成功完成。

如何檢查ResourceManager服務是否正常?

您可以通過以下方式檢查:

  • 檢查ResourceManager HA狀態(如果叢集已啟用HA,需確保有且只有一個Active ResourceManager),以下方式任選一種,檢查欄位haState是否為ACTIVE或STANDBY,haZooKeeperConnectionState是否為CONNECTED:

    • 命令列:yarn rmadmin -getAllServiceState

    • REST API:http://<rmAddress>/ws/v1/cluster/info

    樣本如下。RM-1

  • 檢查應用狀態。

    執行以下命令,查看是否有持續的SUBMITTED或ACCEPTED狀態。

    yarn application -list
  • 查看提交的新應用是否可以正常運行並結束。命令樣本如下。

    hadoop jar <hadoop_home>/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar sleep -m 1 -mt 1000 -r 0

    您可以在sleep -m之間新增配置項以指定Queue,新增的參數為-Dmapreduce.job.queuename,參數值為default。

如何瞭解應用健全狀態?

您可以查看以下資訊。

查詢資訊

描述

基本資料

包括ID、User、Name、Application Type、State、Queue、App-Priority、StartTime、FinishTime、State、FinalStatus、Running Containers、Allocated CPU VCores、Allocated Memory MB和Diagnostics(診斷資訊)等。

  • App列表頁:http://<rmAddress>/cluster/apps。

  • App詳情頁(在App列表頁面,單擊App ID進入): http://<rmAddress>/cluster/app/<applicationId>。

  • App Attempt詳情頁(在App詳情頁面,單擊App Attempt ID進入):http://<rmAddress>/cluster/appattempt/<appAttemptId>。

  • App REST API:http://<rmAddress>/ws/v1/cluster/apps/<applicationId>。

  • App Attempts REST API: http://<rmAddress>/ws/v1/cluster/apps/<applicationId>/appattempts。

Queue資訊

  • Scheduler頁面(葉子節點展開):http://<rmAddress>/cluster/scheduler。

  • Scheduler REST API:http://<rmAddress>/ws/v1/cluster/scheduler。

Container日誌

  • RUNNING Applications

    • 通過NodeManager Log頁面查看:http://<nmHost>:8042/node/containerlogs/<containerId>/<user>。

    • 在運行節點${yarn.nodemanager.local-dirs}目錄下尋找<containerId>子目錄。

  • Finished Applications

    • 通過yarn logs -applicationId <applicationId> -appOwner <user> -containerId <containerId>命令查詢。

    • 通過HDFS命令hadoop fs -ls /logs/<user>/logs/<applicationId>查詢。

應用問題排查流程

  1. 檢查App狀態,通過App詳情頁或App REST API檢查App狀態。

    • 未找到App狀態,可能原因:

      • 用戶端向YARN提交之前失敗退出:用戶端組件問題(檢查提交用戶端日誌:BRS、flowagent等組件)。

      • 用戶端無法串連YARN RM:檢查串連RM地址是否正確、網路是否存在問題。如有網路問題,用戶端可能存在報錯:com.aliyun.emr.flow.agent.common.exceptions.EmrFlowException: ###[E40001,RESOURCE_MANAGER]: Failed to access to resource manager, cause: The stream is closed

    • NEW_SAVING:該狀態處於Zookeeper State Store寫入應用資訊階段。持續該狀態可能原因如下:

    • SUBMITTED:該狀態極少遇到,可能原因為Node Update請求太多造成Capacity Scheduler內部搶鎖堵塞,通常發生在大規模叢集,需最佳化相關流程。相關案例,請參見YARN-9618

    • ACCEPTED:檢查Diagnostics。請根據提示資訊,選擇相應的處理方式。

      • 報錯提示Queue's AM resource limit exceeded。

        • 可能原因:Queue AM已使用資源和AM資源之和超出了Queue AM資源上限,UI條件為${Used Application Master Resources} + ${AM Resource Request} < ${Max Application Master Resources}。

        • 處理方法:上調該Queue的AM資源上限。例如,設定參數yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent為0.5。

      • 報錯提示User's AM resource limit exceeded。

        • 可能原因:Queue user AM已使用資源和AM資源之和超出了Queue user AM資源上限。

        • 處理方法:提高user-limit比例。您可以修改參數yarn.scheduler.capacity.<queue-path>.user-limit-factoryarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent的參數值。

      • 報錯提示AM container is launched, waiting for AM container to Register with RM。

        • 可能原因:AM已啟動,內部初始化未完成(例如,Zookeeper連線逾時等)。

        • 處理方法:需要根據AM日誌進一步排查問題。

      • 報錯提示Application is Activated, waiting for resources to be assigned for AM。

        執行步驟3,檢查AM資源分派為何未滿足。

    • RUNNING:執行步驟2,檢查Container資源請求是否完成。

    • FAILED:檢查diagnostics。請根據提示資訊,選擇相應的處理方式。

      • 報錯提示Maximum system application limit reached,cannot accept submission of application

        • 可能原因:叢集內運行中的總應用數超過上限(配置項:yarn.scheduler.capacity.maximum-applications,預設值:10000)。

        • 處理方法:檢查JMX Metrics,確認各隊列啟動並執行應用數是否符合預期,找出並處理有大量重複提交的問題應用。如果應用都正常,可以根據叢集水位情況適當調大上述配置。

      • 報錯提示Application XXX submitted by user YYY to unknown queue: ZZZ

        • 可能原因:提交到不存在的queue。

        • 處理方法:提交到已存在的leaf queue。

      • 報錯提示Application XXX submitted by user YYY to non-leaf queue: ZZZ

        • 可能原因:提交到parent queue。

        • 處理方法:提交到已存在的leaf queue。

      • 報錯提示Queue XXX is STOPPED. Cannot accept submission of application: YYY

        • 可能原因:提交到STOPPED或DRAINING queue(已下線或正在下線的queue)。

        • 處理方法:提交到RUNNING queue(工作狀態正常的queue)。

      • 報錯提示Queue XXX already has YYY applications, cannot accept submission of application: ZZZ

        • 可能原因:queue應用數達到上限。

        • 處理方法:

          1. 檢查queue內是否有大量重複提交的問題應用。

          2. 調整配置:yarn.scheduler.capacity.<queue-path>.maximum-applications。

      • 報錯提示Queue XXX already has YYY applications from user ZZZ cannot accept submission of application: AAA

        • 可能原因:user應用數達到上限。

        • 處理方法:

          1. 檢查該user是否有大量重複提交的問題應用。

          2. 調整配置:yarn.scheduler.capacity.<queue-path>.maximum-applications、yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent、yarn.scheduler.capacity.<queue-path>.user-limit-factor。

  2. 確認YARN資源分派還未完成。

    1. 在apps列表頁,單擊appID進入AM頁面。

    2. 單擊下方列表的AM-ID,進入AM-Attempt頁面。

    3. 查看Total Outstanding Resource Requests列表中是否有Pending資源(也可以通過PendingRequests REST API查詢):

      • 沒有Pending資源:說明YARN已指派完畢,退出該檢查流程,檢查AM情況。AM-Attempt

      • 有Pending資源:說明YARN資源分派未完成,繼續下一步檢查。

  3. 資源限制檢查。

    檢查叢集或Queue資源,查看資源資訊,例如,Effective Max Resource和Used Resources。

    1. 檢查叢集資源或所在Queue資源或其父Queue資源是否已用完。

    2. 檢查葉子隊列某維度資源是否接近或達到上限。

    3. 當叢集資源接近用滿時(例如85%以上),應用的分配速度可能會變慢,因為大部分機器都沒有資源了,分配的機器沒有資源就會reserve,reserve到一定個數後分配就會變慢,另外也可能是由於記憶體資源和CPU資源不成比例,例如,有的機器上記憶體資源有空閑但CPU資源已經用滿,有的機器上CPU資源有空閑但記憶體已經用滿。

  4. 檢查是否存在Container資源分派成功但啟動失敗的情況,YARN UI的App Attempt頁面可以看到已指派的Container數(間隔一小段時間觀察是否變化),如果有Container啟動失敗,查看對應的NM日誌或Container日誌進一步排查失敗原因。

  5. 動態修改記錄層級:在YARN UI的logLevel頁面(http://RM_IP:8088/logLevel),將org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity(CapacityScheduler調度邏輯所在的package)參數的記錄層級改為DEBUG,如下圖所示。動態修改記錄層級

    重要

    您需要在複現問題的同時開啟,持續幾十秒(由於日誌重新整理的很快,無需持續太長時間),記錄層級改回INFO即可恢複。

單任務/容器(Container)最大可用資源由哪些配置項決定?

由調度器或隊列(queue)配置項決定:

配置項

配置說明

預設值

yarn.scheduler.maximum-allocation-mb

叢集級最大可調度記憶體資源,單位:MB。

EMR預設值為:建立叢集時最大非master執行個體組的可用記憶體(與最大執行個體組的 yarn.nodemanager.resource.memory-mb參數的配置值相同)。

yarn.scheduler.maximum-allocation-vcores

叢集級最大可調度CPU資源,單位:VCore。

EMR預設值為32。

yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb

指定隊列的最大可調度記憶體資源,單位:MB。

預設未配置,配置則覆蓋叢集級配置,僅對指定隊列生效。

yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores

指定隊列的最大可調度CPU資源,單位:VCore。

預設未配置,配置則覆蓋叢集級配置,僅對指定隊列生效。

說明

如果申請資源超過單任務或容器(Container)的最大可用資源配置,應用日誌中能夠發現異常資訊InvalidResourceRequestException: Invalid resource request…

YARN配置修改未生效,如何處理?

  • 可能原因

    • 非熱更新配置,配置關聯的組件未重啟。

    • 熱更新配置,配置生效所需的指定操作未執行。

  • 解決方案:請確保相關配置修改的後續操作正確執行。

    配置集

    配置類型

    更新後續操作

    • capacity-scheduler.xml

    • fair-scheduler.xml

    調度器配置。

    熱更新配置,需要執行RM組件的refresh_queues操作。

    • yarn-env.sh

    • yarn-site.xml

    • mapred-env.sh

    • mapred-site.xml

    YARN組件回合組態。

    重啟配置關聯組件。例如:

    • 修改配置yarn-env.sh中的YARN_RESOURCEMANAGER_HEAPSIZE、yarn-site.xml中的yarn.resourcemanager.nodes.exclude-path等配置項後,需重啟RM。

    • 修改配置yarn-env.sh中的YARN_NODEMANAGER_HEAPSIZE、yarn-site.xml中的yarn.nodemanager.log-dirs等配置項後,需重啟NM。

    • 修改配置mapred-env.sh中的MAPRED_HISTORYSERVER_OPTS、mapred-site.xml中的mapreduce.jobhistory.http.policys等配置項後,需重啟MRHistoryServer。

用戶端異常,提示Exception while invoking getClusterNodes of class ApplicationClientProtocolPBClientImpl over rm2 after 1 fail over attempts. Trying to fail over immediately

  • 問題現象:無法正常訪問Active ResourceManager。ResourceManager日誌異常,提示資訊:WARN org.apache.hadoop.ipc.Server: Incorrect header or version mismatch from 10.33.**.**:53144 got version 6 expected version 9。

  • 問題原因:Hadoop版本太舊,導致用戶端RPC版本不相容。

  • 處理方法:使用匹配的Hadoop版本。

RM處於Standby狀態,無法自動回復Active狀態,該如何處理?

您可以通過以下方式排查問題:

  1. 檢查支援自動回復的必選配置項是否配置正確。

    參數

    描述

    yarn.resourcemanager.ha.enabled

    需要配置為true

    yarn.resourcemanager.ha.automatic-failover.enabled

    需要配置為true

    yarn.resourcemanager.ha.automatic-failover.embedded

    需要配置為true

  2. 修改為上述配置後,問題還未解決,您可以通過以下方式排查問題:

    • 檢查Zookeeper服務是否正常。

    • 檢查Zookeeper用戶端(RM)讀取資料是否超出其Buffer上限。

      • 問題現象:RM日誌記憶體在異常,提示Zookeeper error len*** is out of range!或Unreasonable length = ***。

      • 處理方法:在EMR控制台YARN服務的配置頁面,單擊yarn-env頁簽,更新參數yarn_resourcemanager_opts的參數值為-Djute.maxbuffer=4194304 ,然後重啟RM。

    • Zookeeper服務端寫入資料是否超出其Buffer上限。

      • 問題現象:Zookeeper日誌記憶體在異常,提示Exception causing close of session 0x1000004d5701b6a: Len error ***。

      • 處理方法:Zookeeper服務各節點新增或更新配置項-Djute.maxbuffer= (單位:bytes) ,將Buffer上限調大超過異常顯示的長度。

    • 如果RM或Zookeeper日誌都找不到異常,可能是因為RM選主Zookeeper Ephemeral Node(${yarn.resourcemanager.zk-state-store.parent-path}/${yarn.resourcemanager.cluster-id}/ActiveStandbyElectorLock)被其他Session持有未釋放,可在zkCli命令視窗中stat該節點確認,預設選主方式可能存在未知問題或觸發Zookeeper問題。

      建議修改選主方式,在yarn-site頁簽中,新增或更新配置項yarn.resourcemanager.ha.curator-leader-elector.enabled為true ,然後重啟RM。

RM組件OOM如何處理?

RM OOM包括多種問題類型,您需要先根據RM日誌確定問題類型,可能的問題類型及對應的原因和解決方案如下:

  • Java heap space或GC overhead limit exceeded或頻繁FullGC

    • 原因

      • 直接原因:JVM堆空間不足,RM進程內部對象無法擷取到足夠的資源,並且在拋出OOM之前已經進行過一輪或多輪FullGC回收了失效的對象,仍無法擷取足夠的堆空間用於分配。

      • 原因分析:RM有很多常駐對象(不能被JVM回收的對象),包括叢集、隊列(queue)、應用、執行任務容器(container)、節點(node)等各類資訊。這些資訊佔用的堆空間隨著叢集規模增大而增大,因此對於規模較大的叢集需要保證RM進程的記憶體配置也較大。另一方面,由於需要保留應用的歷史資訊,隨著時間推移歷史應用佔用的儲存空間越來越大,即使是只有1個節點的最小規模叢集,也需要確保有一定的儲存空間(建議不低於2 GB)。

    • 解決方案

      • 如果Master節點資源足夠,建議適當增大RM堆記憶體(yarn-env.sh配置項YARN_RESOURCEMANAGER_HEAPSIZE)。

      • 對於小規模叢集,也可以考慮適當減小需要儲存的歷史應用數量(yarn-site.xml配置項yarn.resourcemanager.max-completed-applications,預設:10000)。

  • unable to create new native thread

    • 原因:RM所在節點上已用的匯流排程數達到系統上限,無法建立新的線程。

      線程數上限由使用者最大可用線程數(查看命令:ulimit -a | grep "max user processes")和PID最大可用數(查看命令:cat /proc/sys/kernel/pid_max)決定。

    • 解決方案

      • 如果可用線程數配置過低,調大相關係統配置。通常規格小的節點可用線程數需配置數萬量級,規格大的節點需配置十幾萬或幾十萬量級。

      • 如果可用線程數配置正常,通常是節點上存在個別問題進程佔用過多線程導致,可以進一步定位哪些進程佔用線程較多。

        執行命令:ps -eLf | awk '{print $2}' | uniq -c | awk '{print $2"\t"$1}' | sort -nrk2 | head ,查看佔用線程數最多的Top10進程,格式:[進程ID] [佔用線程數]。

為什麼節點啟動任務時Localize失敗或任務日誌無法採集與刪除?

  • 問題現象:NM日誌異常,提示java.io.IOException: Couldn't create proxy provider class org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider。

  • 可能原因:HDFS配置異常。

  • 處理方法:

    1. 以上是封裝後的異常,非根因,需要開啟DEBUG層級日誌查看:

      • hadoop用戶端命令列環境(例如執行hadoop fs -ls /命令),開啟DEBUG調試資訊。

        export HADOOP_LOGLEVEL=DEBUG
      • 有Log4j配置的運行環境,Log4j末尾增加log4j.logger.org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider=DEBUG

    2. 以下樣本的根因是使用者曾修改過NameServices配置,將emr-cluster修改為了hadoop-emr-cluster,但是擴容節點時使用了修改前的配置。nameservices

    3. 在EMR控制台HDFS服務的配置頁面,檢查各項配置是否正確。

資源本地化異常,該如何處理?

  • 問題現象:

    • Job AM Container啟動失敗,異常資訊如下。

      Failed job diagnostics資訊為:Application application_1412960082388_788293 failed 2 times due to AM Container for appattempt_1412960082388_788293_000002 exited with exitCode: -1000 due to: EPERM: Operation not permitted
    • 在資源本地化過程中(下載後解壓時)報錯,NodeManager日誌資訊如下。

      INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService: Failed to download rsrc { { hdfs://hadoopnnvip.cm6:9000/user/heyuan.lhy/apv/small_apv_20141128.tar.gz, 1417144849604, ARCHIVE, null },pending,[(container_1412960082388_788293_01_000001)],14170282104675332,DOWNLOADING}
      EPERM: Operation not permitted
              at org.apache.hadoop.io.nativeio.NativeIO$POSIX.chmodImpl(Native Method)
              at org.apache.hadoop.io.nativeio.NativeIO$POSIX.chmod(NativeIO.java:226)
              at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:629)
              at org.apache.hadoop.fs.DelegateToFileSystem.setPermission(DelegateToFileSystem.java:186)
              at org.apache.hadoop.fs.FilterFs.setPermission(FilterFs.java:235)
              at org.apache.hadoop.fs.FileContext$10.next(FileContext.java:949)
              at org.apache.hadoop.fs.FileContext$10.next(FileContext.java:945)
              at org.apache.hadoop.fs.FSLinkResolver.resolve(FSLinkResolver.java:90)
              at org.apache.hadoop.fs.FileContext.setPermission(FileContext.java:945)
              at org.apache.hadoop.yarn.util.FSDownload.changePermissions(FSDownload.java:398)
              at org.apache.hadoop.yarn.util.FSDownload.changePermissions(FSDownload.java:412)
              at org.apache.hadoop.yarn.util.FSDownload.changePermissions(FSDownload.java:412)
              at org.apache.hadoop.yarn.util.FSDownload.call(FSDownload.java:352)
              at org.apache.hadoop.yarn.util.FSDownload.call(FSDownload.java:57)
              at java.util.concurrent.FutureTask.run(FutureTask.java:262)
              at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
              at java.util.concurrent.FutureTask.run(FutureTask.java:262)
              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
              at java.lang.Thread.run(Thread.java:744)
  • 問題原因:壓縮包內含有軟連結導致資源本地化異常。

  • 處理方法:刪除該壓縮包內包含的軟連結。

Container啟動失敗或運行異常,報錯提示No space left on device,該如何處理?

可能原因及排查思路如下:

  • 磁碟已滿。

  • 檢查/sys/fs/cgroup/cpu/hadoop-yarn/cgroup.clone_children/sys/fs/cgroup/cpu/cgroup.clone_children的Cgroups配置。

    1. 如果cgroup.clone_children的值為0,請修改為1,開機啟動項時,設定命令echo 1 > /sys/fs/cgroup/cpu/cgroup.clone_children

    2. 如果沒有上述問題,請檢查同級的cpuset.memscpuset.cpus檔案,hadoop-yarn目錄中的值需要和上層一樣。

  • 可能是Cgroups目錄的子目錄數超出上限65535造成的,檢查YARN配置yarn.nodemanager.linux-container-executor.cgroups.delete-delay-ms或者yarn.nodemanager.linux-container-executor.cgroups.delete-timeout-ms

節點NM服務或任務運行時無法正常解析網域名稱,該如何處理?

  • 問題現象:報錯提示java.net.UnknownHostException: Invalid host name: local host is: (unknown)。

  • 問題原因及處理方法:

    • 查看是否正確配置了DNS伺服器。

      通過以下命令,檢查配置資訊。

      cat /etc/resolv.conf
    • 查看防火牆是否設定了53連接埠的相關規則。

      如果設定了,請關閉防火牆。

    • 查看是否開啟了DNS的NSCD快取服務。

      通過以下命令,檢查服務狀態。

      systemctl status nscd

      如果開啟了DNS的NSCD快取服務,可以執行以下命令,停止快取服務。

      systemctl stop nscd

NM組件OOM如何處理?

NM OOM包括多種問題類型,您需要先根據NM日誌確定問題類型,可能的問題類型及對應的原因和解決方案如下:

  • Java heap space或GC overhead limit exceeded或頻繁FullGC

    • 原因

      • 直接原因:JVM堆空間不足,NM進程內部對象無法擷取到足夠的資源,並且在拋出OOM之前已經進行過一輪或多輪FullGC回收了失效的對象,仍無法擷取足夠的堆空間用於分配。

      • 原因分析:NM進程中的常駐對象不多,一般只包含當前節點、運行應用、執行任務容器(Container)等基本資料,這部分佔用空間不會很大。可能佔用空間較大的是External Shuffle Service的Cache和Buffer,這部分受Shuffle Service相關配置(例如Spark:spark.shuffle.service.index.cache.size或spark.shuffle.file.buffer,MapReduce:mapreduce.shuffle.ssl.file.buffer.size或mapreduce.shuffle.transfer.buffer.size等)影響,並且與使用了Shuffle Service的運行應用數(或執行任務容器數)成正比。這些資訊佔用的堆空間隨著使用ShuffleService應用數或任務容器數的增大而增大,因此對於規格較大可運行任務較多的節點需要保證NM進程的記憶體配置也較大(建議最小不低於1 GB)。

    • 解決方案

      • 如果節點資源足夠,建議適當增大NM堆記憶體(yarn-env.sh配置項YARN_NODEMANAGER_HEAPSIZE)。

      • 檢查Shuffle Service相關配置是否合理,例如Spark Cache配置不應該佔用大部分堆記憶體。

  • Direct buffer memory

    • 原因

      • 直接原因:堆外記憶體溢出導致的OOM,通常與External Shuffle Service有關,例如有的Shuffle Service服務的RPC調用使用了NIO DirectByteBuffer,就會用到堆外記憶體。

      • 原因分析:堆外記憶體跟使用ShuffleService的應用數或任務容器數成正比。對於使用Shuffle Service的任務較多的節點,需要確認NM進程的堆外記憶體配置是否過小。

    • 解決方案

      檢查堆外記憶體配置-XX:MaxDirectMemorySize(yarn-env.sh配置項YARN_NODEMANAGER_OPTS)是否合理。無此配置時預設與堆記憶體大小相同,不合理時適當調大堆外記憶體空間。

  • unable to create new native thread

    參見RM組件OOM如何處理?中的unable to create new native thread部分的內容進行分析解決。

ECS執行個體重啟後NM啟動失敗:cgroup目錄丟失,如何處理?

  • 詳細異常資訊:ResourceHandlerException: Unexpected: Cannot create yarn cgroup Subsystem:cpu Mount point:/proc/mounts User:hadoop Path:/sys/fs/cgroup/cpu/hadoop-yarn

  • 原因:ECS異常重啟可能是ECS核心缺陷(已知問題版本:4.19.91 -21.2.al7.x86_64)導致的。重啟後CPU cgroup失效問題,原因是重啟後cgroup的記憶體資料會被銷毀掉。

  • 解決方案:修改存量叢集節點執行和擴容節點的引導指令碼,在當前環境中建立cgroup目錄並且用rc.local在以後ECS啟動的時候建立目錄。

    # enable cgroups
    mkdir -p /sys/fs/cgroup/cpu/hadoop-yarn
    chown -R hadoop:hadoop /sys/fs/cgroup/cpu/hadoop-yarn
    # enable cgroups after reboot
    echo "mkdir -p /sys/fs/cgroup/cpu/hadoop-yarn" >> /etc/rc.d/rc.local
    echo "chown -R hadoop:hadoop /sys/fs/cgroup/cpu/hadoop-yarn" >> /etc/rc.d/rc.local
    chmod +x /etc/rc.d/rc.local

修改NM resource配置,儲存重啟後未生效,如何處理?

  • 報錯說明:修改yarn.nodemanager.resource.cpu-vcoresyarn.nodemanager.resource.memory-mb參數,儲存重啟NM後,NM資源數未修改。

  • 問題原因:由於機器組可能使用不同CPU記憶體規格的執行個體,所以修改yarn.nodemanager.resource.cpu-vcoresyarn.nodemanager.resource.memory-mb參數,需要修改節點群組維度配置才會生效。

  • 解決方案:在EMR控制台,選擇節點群組維度,選擇需要配置的NM所在節點群組修改資源數的配置,具體操作請參見管理配置項修改NM配置

節點出現Unhealthy問題,如何處理?

  • 原因:

    • 磁碟檢查發現異常:當正常目錄數或總目錄數比率低於磁碟健康比例(yarn-site.xml配置項yarn.nodemanager.disk-health-checker.min-healthy-disks,預設值:0.25)時,將節點標記為UnHealthy。例如NM節點使用4塊磁碟,當4塊磁碟上的目錄均不正常時節點才會標記為UnHealthy,否則只在NM狀態報表中顯示local-dirs are bad或log-dirs are bad,參見節點磁碟問題:local-dirs are bad/log-dirs are bad,如何處理?

    • NM健全狀態檢查指令碼發現異常:該項檢查預設未啟用,需要主動配置健全狀態檢查指令碼(yarn-site.xml配置項yarn.nodemanager.health-checker.script.path)才能開啟。

  • 解決方案

節點磁碟問題:local-dirs are bad/log-dirs are bad,如何處理?

  • 原因:磁碟檢查發現異常。該項檢查預設開啟,周期性檢查local-dirs(任務運行緩衝目錄,包括任務運行依賴的各類檔案、中間資料檔案等)與log-dirs(任務作業記錄目錄,包含全部日誌運行)是否滿足以下條件,只要有一項不滿足就會被標記為bad。

    • 可讀

    • 可寫

    • 可執行

    • 磁碟空間使用率是否低於配置閾值(yarn-site.xml配置項yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage,預設:90%)

      磁碟剩餘可用空間是否大於磁碟最小可用空間的配置值(yarn-site.xml配置項yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb,預設:0)

  • 解決方案

    • 一般都是磁碟空間不足引起,如果確認存在下述情境之一,建議擴容磁碟:

      • NM節點規格較大,可運行任務數較多。

      • 磁碟空間相對較小。

      • 任務運行所依賴的資料或檔案較大。

      • 任務運行產生的中間資料較多。

      • 任務日誌相對較大(磁碟空間佔比高)。

    • 檢查yarn-site.xml配置項yarn.nodemanager.localizer.cache.target-size-mb,如果相對磁碟比例過大會造成歷史任務緩衝佔用磁碟空間過多(超出配置值後才能自動清理)。

    • 壞盤問題,請參見自助壞盤維修流程更換叢集損壞的本地碟

報錯提示User [dr.who] is not authorized to view the logs for application ***,該如何處理?

  • 問題現象:開啟日誌頁面時,提示資訊如下。ERROR_info

  • 問題原因:訪問NodeManager Log頁面時會檢查ACL規則。如果啟用了ACL規則,遠端使用者就要符合以下任一個條件:

    • 是admin使用者。

    • 是app owner。

    • 滿足app自訂ACL規則。

  • 處理方法:檢查是否滿足以上條件中的任一條。

報錯提示HTTP ERROR 401 Authentication required或HTTP ERROR 403 Unauthenticated users are not authorized to access this page,該如何處理?

  • 問題現象:訪問UI或REST API時報錯HTTP ERROR 401或HTTP ERROR 403。HTTP ERROR 401詳細資料如下圖。

    ERROR 401

  • 問題原因:YARN啟用了Simple認證且不允許匿名訪問,詳情請參見Authentication for Hadoop HTTP web-consoles

  • 處理方法:

    • 方式一:URL參數中顯示指定遠端使用者,例如,user.name=***。

    • 方式二:您可以在E-MapReduce控制台的HDFS服務的配置頁簽,在搜尋地區搜尋參數hadoop.http.authentication.simple.anonymous.allowed,修改其參數值為true允許匿名訪問,參數含義請參見Authentication for Hadoop HTTP web-consoles。然後重啟服務,請參見重啟服務

為什麼TotalVcore顯示值不準確?

在YARN UI右上方,Cluster或Metrics REST API結果中,TotalVcore顯示值不準確。此問題是由於社區2.9.2之前版本TotalVcore計算邏輯有問題,詳情請參見https://issues.apache.org/jira/browse/YARN-8443

EMR-3.37.x和EMR-5.3.x及後續版本已修複此問題。

TEZ UI展示的應用資訊不全,該如何處理?

您可以開啟瀏覽器的開發人員工具,排查並處理遇到的問題:

  1. 如果是路徑為http://<rmAddress>/ws/v1/cluster/apps/APPID的異常,則可能原因是該應用已經被RM清理出去(YARN RM最多保留一定數量的歷史應用資訊,預設1000個,超出的會將歷史應用按啟動順序清理出去)。

  2. 如果是路徑為http://<tsAddress>/ws/v1/applicationhistory/...的異常,直接存取該URL(http://<tsAddress>/ws/v1/applicationhistory/... )返回500異常(提示找不到app),則可能原因是該應用資訊未成功儲存(RM發起,查看yarn.resourcemanager.system-metrics-publisher.enabled配置項),或已被Timeline Store清理(查看LevelDB TTL相關配置)。

  3. 如果是路徑為http://<tsAddress>/ws/v1/timeline/...的異常,直接存取該URL(http://<tsAddress>/ws/v1/timeline/...)返回正常(code為200),但是內容是NotFound資訊。

    • 查看AM日誌(syslog)啟動時列印資訊,正常初始化資訊如下:

       [INFO] [main] |history.HistoryEventHandler|: Initializing HistoryEventHandler withrecoveryEnabled=true, historyServiceClassName=org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService
       [INFO] [main] |ats.ATSHistoryLoggingService|: Initializing ATSHistoryLoggingService with maxEventsPerBatch=5, maxPollingTime(ms)=10, waitTimeForShutdown(ms)=-1, TimelineACLManagerClass=org.apache.tez.dag.history.ats.acls.ATSHistoryACLPolicyManager
    • 如果有以下異常資訊,說明AM運行時yarn.timeline-service.enabled配置異常,可能原因為FlowAgent問題(FlowAgent裡對Hive作業有2種實現,一種是Hive命令,另外一種是Beeline命令,此時預設配置yarn.timeline-service.enabled為false。)

      [WARN] [main] |ats.ATSHistoryLoggingService|: org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService is disabled due to Timeline Service being disabled, yarn.timeline-service.enabled set to false

為什麼YARN UI頁面有一個正在啟動並執行Spark Thrift JDBC/ODBC Server任務?

如果您在建立叢集時選擇了Spark服務,叢集會自動啟動一個預設的Spark Thrift Server服務。該服務會佔用一個YARN Driver的資源。在Spark Thrift Server中啟動並執行任務,預設會通過該Driver向YARN申請所需的資源。

yarn.timeline-service.leveldb-timeline-store.path是否支援使用OSS地址?

yarn.timeline-service.leveldb-timeline-store.path參數不支援使用OSS地址。

如果您建立的是Hadoop叢集,則yarn.timeline-service.leveldb-timeline-store.path的預設值與hadoop.tmp.dir參數相同。請不要修改HDFS的hadoop.tmp.dir參數,因為這會影響yarn.timeline-service.leveldb-timeline-store.path的配置。

Timeline Server連線逾時、CPU或Memory佔用異常高問題,該如何處理?

在Tez任務特別多的情況下,寫入YARN的Timeline Server時,可能會出現連線逾時的問題。這是因為Timeline Server進程佔用大量CPU導致節點CPU使用率達到極限,進而影響到了作業開發和其他非核心業務(例如報表產生),所以臨時停止TimelineServer進程來減輕節點的CPU負載。您可以通過修改以下配置項來解決此問題。

在EMR控制台修改Tez和YARN服務的相應配置,新增或修改配置的具體操作,請參見管理配置項

  1. 在EMR控制台Tez服務的配置頁面的tez-site.xml頁簽,新增參數為tez.yarn.ats.event.flush.timeout.millis,參數值為60000的配置項,該參數用來設定Tez任務將事件寫入YARN的Timeline Server時的逾時時間。

  2. 在EMR控制台YARN服務的配置頁面的yarn-site.xml頁簽,新增或修改以下配置項。修改完配置項後需要在YARN服務的狀態頁面重啟下TimelineServer。

    參數

    參數值

    說明

    yarn.timeline-service.store-class

    org.apache.hadoop.yarn.server.timeline.RollingLevelDBTimelineStore

    用於指定YARN Timeline Server的事件儲存類。

    yarn.timeline-service.rolling-period

    daily

    用於設定YARN Timeline Server的事件滾動周期

    yarn.timeline-service.leveldb-timeline-store.read-cache-size

    4194304

    用於設定YARN Timeline Server LevelDB儲存的讀取緩衝大小。

    yarn.timeline-service.leveldb-timeline-store.write-buffer-size

    4194304

    用於設定YARN Timeline Server LevelDB儲存的寫入緩衝區大小。

    yarn.timeline-service.leveldb-timeline-store.max-open-files

    500

    用於設定YARN Timeline Server LevelDB儲存的最大開啟檔案數。