【大數(shù)據(jù)】yarn 任務(wù)中的幾種狀態(tài)變化詳細過程
一、概述
在YARN中,應(yīng)用程序和Container的狀態(tài)變化會影響任務(wù)的執(zhí)行和資源分配。下面是YARN中應(yīng)用程序和Container的狀態(tài)詳細過程:
1)Application 狀態(tài)
是指YARN應(yīng)用程序的狀態(tài)。每個應(yīng)用程序都有一個唯一的Application ID,并且可以通過ResourceManager API或YARN Web UI來獲取應(yīng)用程序的當(dāng)前狀態(tài)。在YARN中,應(yīng)用程序狀態(tài)可以有以下狀態(tài):
- NEW:應(yīng)用程序剛創(chuàng)建時的狀態(tài)。應(yīng)用程序會被分配一個唯一的Application ID,但還沒有分配資源,也沒有進入資源隊列。
- NEW_SAVING:應(yīng)用程序等待資源保存。這個狀態(tài)只存在于開啟了Application歷史保存的集群上,如果沒有保存歷史,則該狀態(tài)的轉(zhuǎn)換不會發(fā)生。
- SUBMITTED:應(yīng)用程序已經(jīng)提交給YARN,并在隊列中等待調(diào)度資源。在該狀態(tài)下,YARN只是對應(yīng)用程序進行了初步的運行時配置,但還沒有將任何容器分配到該應(yīng)用程序。
- ACCEPTED:應(yīng)用程序已經(jīng)通過隊列,并已經(jīng)分配了它需要的初始和最小容器。
- RUNNING:應(yīng)用程序正在運行中,并具有正在運行的容器。
- FINISHED:應(yīng)用程序已經(jīng)成功完成,并且其最終狀態(tài)已經(jīng)保存到Y(jié)ARN應(yīng)用歷史中。
- FAILED:應(yīng)用程序運行失敗,并且其最終狀態(tài)已經(jīng)保存到Y(jié)ARN應(yīng)用歷史中。
- KILLED:應(yīng)用程序已被終止,并且其最終狀態(tài)已經(jīng)保存到Y(jié)ARN應(yīng)用歷史中。
2)Container 狀態(tài)
容器狀態(tài)指的是在YARN集群上運行的應(yīng)用程序內(nèi)部的容器狀態(tài)。在YARN集群上運行的應(yīng)用程序是通過啟動多個容器來實現(xiàn)的,每個容器都運行著應(yīng)用程序的一部分(如MapReduce中的一個map或reduce任務(wù)),并使用一個或多個資源(如內(nèi)存、CPU等)來執(zhí)行任務(wù)。當(dāng)一個應(yīng)用程序啟動后,它的容器狀態(tài)可能有以下幾種:
- NEW:Container剛剛創(chuàng)建,但還沒有分配資源。
- LOCALIZED:Container已經(jīng)獲取了運行時環(huán)境和所需的資源,表示資源已經(jīng)被分配給某個容器,但資源還未完全在該容器上本地化。在容器執(zhí)行應(yīng)用程序之前,需要將應(yīng)用程序所需的資源(如JAR包、配置文件等)拷貝到容器所在的節(jié)點上,并在容器內(nèi)部完成相關(guān)配置。完成本地化操作后,容器就可以開始執(zhí)行應(yīng)用程序。
- RUNNING:Container正在運行,并且已經(jīng)分配了資源。
- COMPLETE:Container已經(jīng)完成工作并退出。
- EXITED_WITH_SUCCESS:表示容器成功執(zhí)行完畢,并且已經(jīng)被清理。
- EXITED_WITH_FAILURE:表示容器執(zhí)行失敗,并且已經(jīng)被清理。
從 NEW 狀態(tài)到 LOCALIZED 狀態(tài),Container 會向 NodeManager 發(fā)起本地化請求,要求 NodeManager 將所需的資源復(fù)制到本地磁盤。從 LOCALIZED 狀態(tài)到 RUNNING 狀態(tài),Container會通過啟動進程來運行任務(wù)。在運行過程中,Container 可能會由于各種原因失敗,進入 FAILED 狀態(tài)。如果Container 順利完成任務(wù),則進入 COMPLETE 狀態(tài)。
綜上所述,YARN中應(yīng)用程序和Container的狀態(tài)變化對于任務(wù)的執(zhí)行和資源分配非常關(guān)鍵。在使用YARN進行任務(wù)調(diào)度和管理時,需要對不同狀態(tài)之間的轉(zhuǎn)換有清晰的理解,以確保任務(wù)能夠順利運行和完成。
二、資源不足情況下狀態(tài)變化
1)資源不足情況下
在YARN中,當(dāng)資源不足時,YARN的資源管理器會對應(yīng)用程序的狀態(tài)進行調(diào)整,以幫助其適應(yīng)現(xiàn)有的資源情況。下面是YARN中應(yīng)用程序狀態(tài)在資源不足的情況下的狀態(tài)變化:
- 如果應(yīng)用程序在 SUBMITTED 狀態(tài)時,發(fā)現(xiàn)資源不足,那么應(yīng)用程序會進入 ACCEPTED狀態(tài)。在這種情況下,YARN會嘗試為應(yīng)用程序分配資源,但可能需要等待其他應(yīng)用程序釋放資源后才能成功分配。
- 如果應(yīng)用程序在 ACCEPTED 狀態(tài)時,發(fā)現(xiàn)資源不足,那么應(yīng)用程序會進入等待狀態(tài)。在等待狀態(tài)下,應(yīng)用程序不會分配任何容器,因為資源不足無法分配。
- 如果應(yīng)用程序在等待狀態(tài)中,嘗試重新分配資源,但仍然可以找到空閑資源。在這種情況下,應(yīng)用程序會返回 ACCEPTED 狀態(tài),并成功分配新的容器。
- 如果應(yīng)用程序在等待狀態(tài)中,無法重新分配資源,那么應(yīng)用程序會轉(zhuǎn)移到 KILLED 或 FAILED 狀態(tài)。在這種情況下,應(yīng)用程序無法分配所需的資源,因此無法完成任務(wù)。
2)任務(wù)超時時間配置
任務(wù)等待超時時間:
- 在YARN中,任務(wù)等待資源的超時時間可以由任務(wù)提交者指定(優(yōu)先級高),并且也可以在應(yīng)用程序的配置文件(例如mapred-site.xml或yarn-site.xml)中進行設(shè)置。超時時間指定的是任務(wù)等待資源的最長時間,如果在此期間內(nèi)無法獲得所需的資源,則任務(wù)將被標(biāo)記為失敗。
- 在默認情況下,任務(wù)等待資源的超時時間是YARN調(diào)度器指定的一個全局值,可以在yarn-site.xml配置文件中進行設(shè)置。該全局值的默認值是600000毫秒(10分鐘)。但也可以針對某個具體任務(wù)的特定需求進行調(diào)整,方法是在提交任務(wù)時構(gòu)造一個ResourceRequest對象,并指定該對象的超時時間。
在YARN中,可以通過配置文件設(shè)置任務(wù)等待資源的超時時間,其中包括 mapred-site.xml 和 yarn-site.xml 兩個文件。
1、yarn-site.xml 文件中配置超時時間
在 yarn-site.xml 文件中,可以設(shè)置以下兩個參數(shù)來控制任務(wù)等待資源的超時時間:
- yarn.nodemanager.resource.timeout-ms:這個參數(shù)定義了節(jié)點管理器等待應(yīng)用程序可能需要的資源的最長時間。如果等待時間超過此限制,則節(jié)點管理器會殺死該應(yīng)用程序。默認值為10分鐘(600000毫秒)。
- yarn.resourcemanager.resource-tracker.client.thread-count:這個參數(shù)定義了資源管理器向節(jié)點管理器發(fā)送請求的線程數(shù)。通過增加這個參數(shù),可以提高資源管理器向節(jié)點管理器發(fā)送請求的并發(fā)性能,從而減少任務(wù)等待的時間。
2、mapred-site.xml 文件中配置超時時間
在 mapred-site.xml 文件中,可以設(shè)置以下參數(shù)來控制 MapReduce 作業(yè)等待資源的超時時間:
- mapreduce.client.completion.pollinterval:這個參數(shù)定義了客戶端輪詢作業(yè)的完成狀態(tài)的時間間隔。默認值為5000毫秒。
- mapreduce.client.progressmonitor.pollinterval:這個參數(shù)定義了客戶端輪詢作業(yè)的進度狀態(tài)的時間間隔。默認值為1000毫秒。
在這兩個文件中,都可以使用默認值,也可以根據(jù)實際需求進行調(diào)整。當(dāng)然也可以在程序中設(shè)定超時時間,示例代碼如下:
ResourceRequest resReq = Records.newRecord(ResourceRequest.class);
resReq.setResourceName(capability.getResourceName());
resReq.setCapability(capability);
resReq.setNumContainers(numContainers);
resReq.setRelaxLocality(relaxLocality);
resReq.setPriority(priority);
//設(shè)置最長等待時間為30分鐘,即1800000毫秒
resReq.setTimeout(1800000);
appAttemptID.setAttemptId(appAttemptNumber);
amClient.addContainerRequest(resReq);
綜上所述,在應(yīng)用程序和資源的狀態(tài)變化中,資源不足是一個常見的問題。在處理這種情況時,YARN會對應(yīng)用程序的狀態(tài)進行調(diào)整,以盡可能適應(yīng)現(xiàn)有的資源情況。在使用YARN進行任務(wù)調(diào)度和管理時,需要注意資源分配情況,并根據(jù)實際情況進行調(diào)整,以確保任務(wù)能夠順利運行和完成。
三、環(huán)境準(zhǔn)備
如果已經(jīng)有了環(huán)境了,可以忽略,如果想快速部署環(huán)境進行測試可以參考我這篇文章:通過 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 等組件構(gòu)成。
當(dāng)用戶給Yarn提交了一個應(yīng)用程序后,Yarn的主要工作流程如下圖:
- 【步驟1】用戶向Yarn提交應(yīng)用程序,其中包括用戶程序、相關(guān)文件、啟動 ApplicationMaster 命令、 ApplicationMaster程序等。
- 【步驟2】ResourceManager為該應(yīng)用程序分配第一個Container,并且與Container所在的NodeManager通信,并且要求該NodeManager在這個Container中啟動應(yīng)用程序?qū)?yīng)的ApplicationMaster。
- 【步驟3】ApplicationMaster 首先會向 ResourceManager 注冊,這樣用戶才可以直接通過 ResourceManager 查看到應(yīng)用程序的運行狀態(tài),然后它為準(zhǔn)備為該應(yīng)用程序的各個任務(wù)申請資源,并監(jiān)控它們的運行狀態(tài)直到運行結(jié)束,即重復(fù)后面4~7步驟。
- 【步驟4】ApplicationMaster 采用輪詢的方式通過 RPC 協(xié)議向 ResourceManager 申請和領(lǐng)取資源。
- 【步驟5】一旦 ApplicationMaster 申請到資源后,便會與申請到的 Container 所對應(yīng)的 NodeManager 進行通信,并且要求它在該Container中啟動任務(wù)。
- 【步驟6】任務(wù)啟動。NodeManager 為要啟動的任務(wù)配置好運行環(huán)境,包括環(huán)境變量、JAR包、二進制程序等,并且將啟動命令寫在一個腳本里,通過該腳本運行任務(wù)。
- 【步驟7】各個任務(wù)通過 RPC 協(xié)議向其對應(yīng)的 ApplicationMaster 匯報自己的運行狀態(tài)和進度,以讓ApplicationMaster隨時掌握各個任務(wù)的運行狀態(tài),從而可以再任務(wù)運行失敗時重啟任務(wù)。
- 【步驟8】應(yīng)用程序運行完畢后,其對應(yīng)的ApplicationMaster會向ResourceManager通信,要求注銷和關(guān)閉自己。
這個需要注意的是在整個工作流程當(dāng)中,ResourceManager 和 NodeManager 都是通過心跳保持聯(lián)系的,NodeManager 會通過心跳信息向 ResourceManager 匯報自己所在節(jié)點的資源使用情況。
五、Yarn 常用命令
下面是YARN常用命令的一些示例:
1)查看應(yīng)用程序
# 查看在運行的任務(wù)
yarn application -list
# 查看所有任務(wù)
yarn application -list -appStates ALL
# 狀態(tài)值:ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,FINISHED,FAILED,KILLED
該命令用于顯示當(dāng)前正在運行中的所有應(yīng)用程序的列表,包括應(yīng)用程序ID、名稱、用戶、隊列、開始時間、結(jié)束時間、狀態(tài)等信息。
- 查看YARN應(yīng)用程序的狀態(tài):
yarn application -status <Application ID>
# 示例:
yarn application -status application_1683209715059_0002
該命令用于查看指定 Application ID 的應(yīng)用程序的狀態(tài)??梢圆榭磻?yīng)用程序的名稱、用戶、隊列、開始時間、結(jié)束時間、狀態(tài)、進度等信息。
3)查看指定應(yīng)用程序的日志
yarn logs -applicationId <Application ID>
#示例:
yarn logs -applicationId application_1683209715059_0002
該命令用于查看指定應(yīng)用程序的日志。可以使用該命令查看應(yīng)用程序在運行過程中輸出到 STDOUT 和STDERR 的所有日志信息。
4)查看NodeManager ID
使用以下命令查看YARN集群中所有NodeManager的狀態(tài):
yarn node -list
該命令將顯示所有NodeManager節(jié)點的狀態(tài),包括主機名,HTTP地址,狀態(tài),容器數(shù)量等信息。
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上指定應(yīng)用程序的日志??梢允褂迷撁畈榭垂?jié)點管理器(NodeManager)在運行過程中輸出到 STDOUT 和 STDERR 的所有日志信息。
6)殺死指定應(yīng)用程序
# 查看在運行的任務(wù)
yarn application -list
# kill 任務(wù)
yarn application -kill <Application ID>
# 示例:
yarn application -kill application_1683209715059_0002
該命令用于殺死指定 Application ID 的應(yīng)用程序。如果應(yīng)用程序正在運行,則它將被強制終止并結(jié)束。
7)服務(wù)啟停命令
1、啟停YARN服務(wù)
# 包括RM,NM,啟動
start-yarn.sh
# 停止
stop-yarn.sh
2、啟停YARN resourcemanager、NM服務(wù)
# 啟動 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 服務(wù)
YARN Proxy可以讓您通過Web界面對集群進行監(jiān)視和管理,而不必直接連接到每個節(jié)點。YARN Proxy服務(wù)是一個Web代理服務(wù)器,運行在YARN集群之外,并提供對集群資源管理器和節(jié)點管理器的訪問。您可以通過代理訪問Web界面,查看群集使用情況和任務(wù)執(zhí)行狀況。
yarn --daemon start proxyserver
這里就不展開講解YARN proxyserver 服務(wù),后面有單獨講解。