天天看點

【大資料】yarn 任務中的幾種狀态變化詳細過程

作者:大資料老司機

一、概述

在YARN中,應用程式和Container的狀态變化會影響任務的執行和資源配置設定。下面是YARN中應用程式和Container的狀态詳細過程:

1)Application 狀态

是指YARN應用程式的狀态。每個應用程式都有一個唯一的Application ID,并且可以通過ResourceManager API或YARN Web UI來擷取應用程式的目前狀态。在YARN中,應用程式狀态可以有以下狀态:

  1. NEW:應用程式剛建立時的狀态。應用程式會被配置設定一個唯一的Application ID,但還沒有配置設定資源,也沒有進入資源隊列。
  2. NEW_SAVING:應用程式等待資源儲存。這個狀态隻存在于開啟了Application曆史儲存的叢集上,如果沒有儲存曆史,則該狀态的轉換不會發生。
  3. SUBMITTED:應用程式已經送出給YARN,并在隊列中等待排程資源。在該狀态下,YARN隻是對應用程式進行了初步的運作時配置,但還沒有将任何容器配置設定到該應用程式。
  4. ACCEPTED:應用程式已經通過隊列,并已經配置設定了它需要的初始和最小容器。
  5. RUNNING:應用程式正在運作中,并具有正在運作的容器。
  6. FINISHED:應用程式已經成功完成,并且其最終狀态已經儲存到YARN應用曆史中。
  7. FAILED:應用程式運作失敗,并且其最終狀态已經儲存到YARN應用曆史中。
  8. KILLED:應用程式已被終止,并且其最終狀态已經儲存到YARN應用曆史中。

2)Container 狀态

容器狀态指的是在YARN叢集上運作的應用程式内部的容器狀态。在YARN叢集上運作的應用程式是通過啟動多個容器來實作的,每個容器都運作着應用程式的一部分(如MapReduce中的一個map或reduce任務),并使用一個或多個資源(如記憶體、CPU等)來執行任務。當一個應用程式啟動後,它的容器狀态可能有以下幾種:

  1. NEW:Container剛剛建立,但還沒有配置設定資源。
  2. LOCALIZED:Container已經擷取了運作時環境和所需的資源,表示資源已經被配置設定給某個容器,但資源還未完全在該容器上本地化。在容器執行應用程式之前,需要将應用程式所需的資源(如JAR包、配置檔案等)拷貝到容器所在的節點上,并在容器内部完成相關配置。完成本地化操作後,容器就可以開始執行應用程式。
  3. RUNNING:Container正在運作,并且已經配置設定了資源。
  4. COMPLETE:Container已經完成工作并退出。
  5. EXITED_WITH_SUCCESS:表示容器成功執行完畢,并且已經被清理。
  6. EXITED_WITH_FAILURE:表示容器執行失敗,并且已經被清理。

從 NEW 狀态到 LOCALIZED 狀态,Container 會向 NodeManager 發起本地化請求,要求 NodeManager 将所需的資源複制到本地磁盤。從 LOCALIZED 狀态到 RUNNING 狀态,Container會通過啟動程序來運作任務。在運作過程中,Container 可能會由于各種原因失敗,進入 FAILED 狀态。如果Container 順利完成任務,則進入 COMPLETE 狀态。

【大資料】yarn 任務中的幾種狀态變化詳細過程

綜上所述,YARN中應用程式和Container的狀态變化對于任務的執行和資源配置設定非常關鍵。在使用YARN進行任務排程和管理時,需要對不同狀态之間的轉換有清晰的了解,以確定任務能夠順利運作和完成。

二、資源不足情況下狀态變化

1)資源不足情況下

在YARN中,當資源不足時,YARN的資料總管會對應用程式的狀态進行調整,以幫助其适應現有的資源情況。下面是YARN中應用程式狀态在資源不足的情況下的狀态變化:

  • 如果應用程式在 SUBMITTED 狀态時,發現資源不足,那麼應用程式會進入 ACCEPTED狀态。在這種情況下,YARN會嘗試為應用程式配置設定資源,但可能需要等待其他應用程式釋放資源後才能成功配置設定。
  • 如果應用程式在 ACCEPTED 狀态時,發現資源不足,那麼應用程式會進入等待狀态。在等待狀态下,應用程式不會配置設定任何容器,因為資源不足無法配置設定。
  • 如果應用程式在等待狀态中,嘗試重新配置設定資源,但仍然可以找到空閑資源。在這種情況下,應用程式會傳回 ACCEPTED 狀态,并成功配置設定新的容器。
  • 如果應用程式在等待狀态中,無法重新配置設定資源,那麼應用程式會轉移到 KILLED 或 FAILED 狀态。在這種情況下,應用程式無法配置設定所需的資源,是以無法完成任務。

2)任務逾時時間配置

任務等待逾時時間:

  • 在YARN中,任務等待資源的逾時時間可以由任務送出者指定(優先級高),并且也可以在應用程式的配置檔案(例如mapred-site.xml或yarn-site.xml)中進行設定。逾時時間指定的是任務等待資源的最長時間,如果在此期間内無法獲得所需的資源,則任務将被标記為失敗。
  • 在預設情況下,任務等待資源的逾時時間是YARN排程器指定的一個全局值,可以在yarn-site.xml配置檔案中進行設定。該全局值的預設值是600000毫秒(10分鐘)。但也可以針對某個具體任務的特定需求進行調整,方法是在送出任務時構造一個ResourceRequest對象,并指定該對象的逾時時間。

在YARN中,可以通過配置檔案設定任務等待資源的逾時時間,其中包括 mapred-site.xml 和 yarn-site.xml 兩個檔案。

1、yarn-site.xml 檔案中配置逾時時間

在 yarn-site.xml 檔案中,可以設定以下兩個參數來控制任務等待資源的逾時時間:

  • yarn.nodemanager.resource.timeout-ms:這個參數定義了節點管理器等待應用程式可能需要的資源的最長時間。如果等待時間超過此限制,則節點管理器會殺死該應用程式。預設值為10分鐘(600000毫秒)。
  • yarn.resourcemanager.resource-tracker.client.thread-count:這個參數定義了資料總管向節點管理器發送請求的線程數。通過增加這個參數,可以提高資料總管向節點管理器發送請求的并發性能,進而減少任務等待的時間。

2、mapred-site.xml 檔案中配置逾時時間

在 mapred-site.xml 檔案中,可以設定以下參數來控制 MapReduce 作業等待資源的逾時時間:

  • mapreduce.client.completion.pollinterval:這個參數定義了用戶端輪詢作業的完成狀态的時間間隔。預設值為5000毫秒。
  • mapreduce.client.progressmonitor.pollinterval:這個參數定義了用戶端輪詢作業的進度狀态的時間間隔。預設值為1000毫秒。

在這兩個檔案中,都可以使用預設值,也可以根據實際需求進行調整。當然也可以在程式中設定逾時時間,示例代碼如下:

ResourceRequest resReq = Records.newRecord(ResourceRequest.class);
resReq.setResourceName(capability.getResourceName());
resReq.setCapability(capability);
resReq.setNumContainers(numContainers);
resReq.setRelaxLocality(relaxLocality);
resReq.setPriority(priority);
//設定最長等待時間為30分鐘,即1800000毫秒
resReq.setTimeout(1800000);
appAttemptID.setAttemptId(appAttemptNumber);
amClient.addContainerRequest(resReq);
           
綜上所述,在應用程式和資源的狀态變化中,資源不足是一個常見的問題。在處理這種情況時,YARN會對應用程式的狀态進行調整,以盡可能适應現有的資源情況。在使用YARN進行任務排程和管理時,需要注意資源配置設定情況,并根據實際情況進行調整,以確定任務能夠順利運作和完成。

三、環境準備

如果已經有了環境了,可以忽略,如果想快速部署環境進行測試可以參考我這篇文章:通過 docker-compose 快速部署 Hive 詳細教程

# 登入容器
docker exec -it hive-hiveserver2 bash
# 連接配接hive
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop
           

四、Yarn 工作流程

YARN主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等元件構成。

【大資料】yarn 任務中的幾種狀态變化詳細過程

當使用者給Yarn送出了一個應用程式後,Yarn的主要工作流程如下圖:

【大資料】yarn 任務中的幾種狀态變化詳細過程
  • 【步驟1】使用者向Yarn送出應用程式,其中包括使用者程式、相關檔案、啟動 ApplicationMaster 指令、 ApplicationMaster程式等。
  • 【步驟2】ResourceManager為該應用程式配置設定第一個Container,并且與Container所在的NodeManager通信,并且要求該NodeManager在這個Container中啟動應用程式對應的ApplicationMaster。
  • 【步驟3】ApplicationMaster 首先會向 ResourceManager 注冊,這樣使用者才可以直接通過 ResourceManager 檢視到應用程式的運作狀态,然後它為準備為該應用程式的各個任務申請資源,并監控它們的運作狀态直到運作結束,即重複後面4~7步驟。
  • 【步驟4】ApplicationMaster 采用輪詢的方式通過 RPC 協定向 ResourceManager 申請和領取資源。
  • 【步驟5】一旦 ApplicationMaster 申請到資源後,便會與申請到的 Container 所對應的 NodeManager 進行通信,并且要求它在該Container中啟動任務。
  • 【步驟6】任務啟動。NodeManager 為要啟動的任務配置好運作環境,包括環境變量、JAR包、二進制程式等,并且将啟動指令寫在一個腳本裡,通過該腳本運作任務。
  • 【步驟7】各個任務通過 RPC 協定向其對應的 ApplicationMaster 彙報自己的運作狀态和進度,以讓ApplicationMaster随時掌握各個任務的運作狀态,進而可以再任務運作失敗時重新開機任務。
  • 【步驟8】應用程式運作完畢後,其對應的ApplicationMaster會向ResourceManager通信,要求登出和關閉自己。

這個需要注意的是在整個工作流程當中,ResourceManager 和 NodeManager 都是通過心跳保持聯系的,NodeManager 會通過心跳資訊向 ResourceManager 彙報自己所在節點的資源使用情況。

五、Yarn 常用指令

下面是YARN常用指令的一些示例:

1)檢視應用程式

# 檢視在運作的任務
yarn application -list

# 檢視所有任務
yarn application -list -appStates ALL
# 狀态值:ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,FINISHED,FAILED,KILLED
           

該指令用于顯示目前正在運作中的所有應用程式的清單,包括應用程式ID、名稱、使用者、隊列、開始時間、結束時間、狀态等資訊。

  • 檢視YARN應用程式的狀态:
yarn application -status <Application ID>

# 示例:
yarn application -status application_1683209715059_0002
           

該指令用于檢視指定 Application ID 的應用程式的狀态。可以檢視應用程式的名稱、使用者、隊列、開始時間、結束時間、狀态、進度等資訊。

3)檢視指定應用程式的日志

yarn logs -applicationId <Application ID>

#示例:
yarn logs -applicationId application_1683209715059_0002
           

該指令用于檢視指定應用程式的日志。可以使用該指令檢視應用程式在運作過程中輸出到 STDOUT 和STDERR 的所有日志資訊。

4)檢視NodeManager ID

使用以下指令檢視YARN叢集中所有NodeManager的狀态:

yarn node -list
           

該指令将顯示所有NodeManager節點的狀态,包括主機名,HTTP位址,狀态,容器數量等資訊。

5)檢視指定NodeManager的日志

# 檢視<Application ID>
yarn application -list -appStates ALL

# 檢視<NodeManager ID>
yarn node -list

# 再檢視日志
yarn logs -applicationId <Application ID> -nodeId <NodeManager ID>

# 示例:
yarn logs -applicationId application_1683209715059_0002 hadoop-yarn-nm-0:40140
           

該指令用于檢視指定NodeManager上指定應用程式的日志。可以使用該指令檢視節點管理器(NodeManager)在運作過程中輸出到 STDOUT 和 STDERR 的所有日志資訊。

6)殺死指定應用程式

# 檢視在運作的任務
yarn application -list

# kill 任務
yarn application -kill <Application ID>

# 示例:
yarn application -kill application_1683209715059_0002
           

該指令用于殺死指定 Application ID 的應用程式。如果應用程式正在運作,則它将被強制終止并結束。

7)服務啟停指令

1、啟停YARN服務

# 包括RM,NM,啟動
start-yarn.sh

# 停止
stop-yarn.sh
           

2、啟停YARN resourcemanager、NM服務

# 啟動 resourcemanager
yarn --daemon start resourcemanager
# 停止 resourcemanager
yarn --daemon stop  resourcemanager

# 啟動 nodemanager
yarn --daemon start  nodemanager
# 停止 nodemanager
yarn --daemon stop  nodemanager

# 指定日志級别,有 DEBUG、INFO、WARN、ERROR等級别。
#示例:
yarn --loglevel DEBUG --daemon start resourcemanager
           

8)啟停YARN proxyserver 服務

YARN Proxy可以讓您通過Web界面對叢集進行監視和管理,而不必直接連接配接到每個節點。YARN Proxy服務是一個Web代理伺服器,運作在YARN叢集之外,并提供對叢集資料總管和節點管理器的通路。您可以通過代理通路Web界面,檢視群集使用情況和任務執行狀況。

yarn --daemon start proxyserver
           

這裡就不展開講解YARN proxyserver 服務,後面有單獨講解。

yarn 任務中的幾種狀态變化詳細過程講解就先到這裡了,有任何疑問歡迎給我留言,後續會持續更新相關文章,也可關注我公衆号【大資料與雲原生技術分享】加群交流或私信咨詢問題~

繼續閱讀