免费99精品国产自在现线观看_人妻少妇精品视频区性色_丝袜 屁股 在线 国产_无码视频在线免费观看

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

1. 概述

1.1. Yarn基本概念

YARN(Yet Another Resource Negotiator)是Hadoop 2.x的一個計算框架,旨在解決Hadoop 1.x中的資源管理和任務(wù)調(diào)度問題。它的主要目的是將MR1 JobTracker 的兩個主要功能(資源管理和作業(yè)調(diào)度/監(jiān)控)分離,以便更好地支持多種應(yīng)用程序,而不是僅支持MapReduce。

YARN采用了全新的架構(gòu),包括ResourceManager、NodeManager和ApplicationMaster等組件。其中,ResourceManager負責(zé)整個集群中的資源分配,NodeManager負責(zé)管理并監(jiān)控節(jié)點上的容器,ApplicationMaster是一個Yarn的客戶端,用于管理當(dāng)前任務(wù)的調(diào)度。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

  • ResourceManager(RM)

    • 負責(zé)整個系統(tǒng)的資源管理和分配,包括處理客戶端請求、啟動/監(jiān)控APP master、監(jiān)控nodemanager、資源的分配與調(diào)度

    • Scheduler:根據(jù)容量、隊列等限制條件(如每個隊列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個正在運行的應(yīng)用程序。Yarn提供了多種直接可用的調(diào)度器,比如FIFO Scheduler、Fair Scheduler和Capacity Scheduler等。

    • Applications Manager:負責(zé)管理整個系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動ApplicationMaster、監(jiān)控ApplicationMaster運行狀態(tài)并在失敗時重新啟動它等。

  • NodeManager(NM)

    • 負責(zé)接收處理來自ResourceManager的資源分配請求,分配具體的Container給應(yīng)用

    • 它還負責(zé)監(jiān)控并報告Container使用信息給ResourceManager

    • Container是一個動態(tài)資源分配單位,它將內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等資源封裝在一起,從而限定每個任務(wù)使用的資源量

    • NodeManager只負責(zé)管理自身的Container,它并不知道運行在它上面應(yīng)用的信息。負責(zé)管理應(yīng)用信息的組件是ApplicationMaster

  • ApplicationMaster

    • 應(yīng)用程序級別的,運行在Container中,管理運行在YARN上的應(yīng)用程序。

    • 向ResourceManager申請資源

    • 和NodeManager協(xié)同工作來運行應(yīng)用的各個任務(wù)

    • 與NodeManager通信以啟動或停止任務(wù)

    • 監(jiān)控所有任務(wù)運行狀態(tài),并在任務(wù)運行失敗時重新為任務(wù)申請資源以重啟任務(wù)

1.2. 任務(wù)管理及資源管理

通過YARN的任務(wù)管理,可以將任務(wù)分配到不同的容器中,運行在不同的節(jié)點上,以滿足任務(wù)的不同需求。通過任務(wù)分配、任務(wù)監(jiān)控和任務(wù)狀態(tài)跟蹤等方式,確保應(yīng)用程序能夠在集群中順利運行。

同時,YARN的資源管理模塊負責(zé)管理Master和slave節(jié)點的資源,包括CPU、內(nèi)存和磁盤等資源。通過YARN的資源管理,可以實現(xiàn)有效的資源池管理,通過實現(xiàn)資源調(diào)度和資源分配策略,使得不同應(yīng)用程序能夠充分利用集群資源,優(yōu)化集群的性能。

因此,YARN的任務(wù)管理和資源管理至關(guān)重要。接下來我們詳細介紹yarn的任務(wù)管理及資源管理。

2. 任務(wù)管理

2.1. 任務(wù)運行流程

當(dāng)用戶向YARN中提交一個應(yīng)用程序后,YARN將分兩個階段運行該應(yīng)用程序:第一個階段是啟動ApplicationMaster;第二個階段是由ApplicationMaster創(chuàng)建應(yīng)用程序,為它申請資源,并監(jiān)控它的整個運行過程,直到運行完成,如下圖所示。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

(1)作業(yè)提交

第1步:Client調(diào)用job.waitForCompletion方法,向整個集群提交mapreduce作業(yè)。

第2步:Client向RM申請一個作業(yè)id。

第3步:RM給Client返回該job資源的提交路徑和作業(yè)id。

第4步:Client提交JAR包、切片信息和配置文件到指定的資源提交路徑。

第5步:Client提交完資源后,向RM申請運行MrAppMaster。

(2)作業(yè)初始化

第6步:當(dāng)RM收到Client的請求后,將該job添加到資源調(diào)度器中。

第7步:某一個空閑的NM領(lǐng)取到該Job。

第8步:該NM創(chuàng)建Container,并產(chǎn)生MRAppmaster。

第9步:下載Client提交的資源到本地。

(3)任務(wù)分配

第10步:MrAppMaster向RM申請運行多個MapTask任務(wù)資源。

第11步:RM將運行MapTask任務(wù)分配給另外兩個NodeManager,另兩個NodeManager分別領(lǐng)取任務(wù)并創(chuàng)建容器。

(4)任務(wù)運行

第12步:MR向兩個接收到任務(wù)的NodeManager發(fā)送程序啟動腳本,這兩個NodeManager分別啟動MapTask,MapTask對數(shù)據(jù)分區(qū)排序。

第13步:MrAppMaster等待所有MapTask運行完畢后,向RM申請容器,運行ReduceTask。

第14步:ReduceTask向MapTask獲取相應(yīng)分區(qū)的數(shù)據(jù)。

第15步:程序運行完畢后,MR會向RM申請注銷自己。

(5)進度和狀態(tài)更新

YARN中的任務(wù)將其進度和狀態(tài)返回給應(yīng)用管理器, 客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設(shè)置)向應(yīng)用管理器請求進度更新, 展示給用戶。

(6)作業(yè)完成

除了向應(yīng)用管理器請求作業(yè)進度外, 客戶端每5秒都會通過調(diào)用waitForCompletion來檢查作業(yè)是否完成。時間間隔可以通過mapreduce.client.completion.pollinterval來設(shè)置。作業(yè)完成之后, 應(yīng)用管理器和Container會清理工作狀態(tài)。作業(yè)的信息會被作業(yè)歷史服務(wù)器存儲以備之后用戶核查。

2.2. 任務(wù)狀態(tài)跟蹤和監(jiān)控

在任務(wù)運行過程中,YARN使用ApplicationMaster來跟蹤和管理任務(wù)的狀態(tài),ApplicationMaster可以定期向ResourceManager匯報任務(wù)的狀態(tài),從而實現(xiàn)狀態(tài)跟蹤。此外,可以通過定期監(jiān)控Container的狀態(tài),了解任務(wù)的運行情況和狀態(tài)。

下面是YARN中應(yīng)用程序和Container的狀態(tài)詳細過程:

2.2.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):

  1. NEW:應(yīng)用程序剛創(chuàng)建時的狀態(tài)。應(yīng)用程序會被分配一個唯一的Application ID,但還沒有分配資源,也沒有進入資源隊列。

  2. NEW_SAVING:應(yīng)用程序等待資源保存。這個狀態(tài)只存在于開啟了Application歷史保存的集群上,如果沒有保存歷史,則該狀態(tài)的轉(zhuǎn)換不會發(fā)生。

  3. SUBMITTED:應(yīng)用程序已經(jīng)提交給YARN,等待調(diào)度器處理,****尚未進行資源分配

    1. 調(diào)度器會根據(jù)調(diào)度算法和優(yōu)先級等因素,從隊列中選擇合適的應(yīng)用程序并為其分配資源。調(diào)度器會考慮集群中的負載情況,保證資源的合理利用和公平共享。調(diào)度器完成后,應(yīng)用程序的狀態(tài)將被更新為”ACCEPTED”

  4. ACCEPTED:應(yīng)用程序已經(jīng)通過隊列,并ResourceManager已經(jīng)分配了它需要的初始和最小容器( 這只是一個預(yù)分配的過程,并不代表資源已經(jīng)真正分配給了應(yīng)用程序)。

    1. 應(yīng)用程序已通過隊列,并為其分配了初始和最小容器,但實際的計算資源尚未分配

  5. RUNNING:應(yīng)用程序正在運行中,并具有正在運行的容器。

    1. 應(yīng)用程序已獲得實際的計算資源分配,并開始執(zhí)行任務(wù)

  6. FINISHED:應(yīng)用程序已經(jīng)成功完成,并且其最終狀態(tài)已經(jīng)保存到Y(jié)ARN應(yīng)用歷史中。

  7. FAILED:應(yīng)用程序運行失敗,并且其最終狀態(tài)已經(jīng)保存到Y(jié)ARN應(yīng)用歷史中。

  8. KILLED:應(yīng)用程序已被終止,并且其最終狀態(tài)已經(jīng)保存到Y(jié)ARN應(yīng)用歷史中。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

示例:

  • application_1687214371118_29142:

    • 第一次查詢時,任務(wù)狀態(tài)為ACCEPTED,這個狀態(tài)表示任務(wù)已經(jīng)被ResourceManager接受并等待資源分配

    • 等待資源分配的原因,可以是沒有可用資源了,也可能是正在對任務(wù)進行一些準備工作,例如檢查任務(wù)的依賴關(guān)系、資源需求等。這些準備工作可能需要一些時間。

    • 一旦適當(dāng)?shù)馁Y源可用,并且所有準備工作完成,任務(wù)將從ACCEPTED狀態(tài)轉(zhuǎn)換為RUNNING狀態(tài),并開始在相應(yīng)的容器中運行

2.2.1.1. 資源不足情況下狀態(tài)變化

當(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.2.2. Container 狀態(tài)

指的是在YARN集群上運行的應(yīng)用程序內(nèi)部的container狀態(tài)。在YARN集群上運行的應(yīng)用程序是通過啟動多個container來實現(xiàn)的,每個container都運行著應(yīng)用程序的一部分(如MapReduce中的一個map或reduce任務(wù)),并使用一個或多個資源(如內(nèi)存、CPU等)來執(zhí)行任務(wù)。當(dāng)一個應(yīng)用程序啟動后,它的容器狀態(tài)可能有以下幾種:

  1. NEW:Container剛剛創(chuàng)建,但還沒有分配資源。

  2. LOCALIZED:Container已經(jīng)獲取了運行時環(huán)境和所需的資源,表示資源已經(jīng)被分配給某個容器,但資源還未完全在該容器上本地化。在容器執(zhí)行應(yīng)用程序之前,需要將應(yīng)用程序所需的資源(如JAR包、配置文件等)拷貝到容器所在的節(jié)點上,并在容器內(nèi)部完成相關(guān)配置。完成本地化操作后,容器就可以開始執(zhí)行應(yīng)用程序。

  3. RUNNING:Container正在運行,并且已經(jīng)分配了資源。

  4. COMPLETE:Container已經(jīng)完成工作并退出。

  5. EXITED_WITH_SUCCESS:表示容器成功執(zhí)行完畢,并且已經(jīng)被清理。

  6. 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)。

2.2.3. Yarn任務(wù)監(jiān)控

Yarn提供了豐富的任務(wù)監(jiān)控和管理功能,可以實時監(jiān)控和管理Yarn集群中的任務(wù),并及時采取必要的措施來優(yōu)化性能、發(fā)現(xiàn)問題和確保任務(wù)的順利執(zhí)行。以下是一些常見的Yarn任務(wù)監(jiān)控方法:

1. Yarn Web UI:Yarn的Web界面是一個強大的任務(wù)監(jiān)控工具。通過訪問Yarn的Web UI地址,可以查看整個集群上運行的應(yīng)用程序、任務(wù)的執(zhí)行狀態(tài)、資源分配情況等詳細信息。可以通過該界面來監(jiān)視任務(wù)的進度、資源使用情況和容器的狀態(tài)。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

2. Yarn命令行界面(CLI):Yarn提供了一組命令行工具,可以用于查看和管理任務(wù)。例如:

  • “yarn application -list”命令可以列出集群上正在運行的應(yīng)用程序及其狀態(tài);

  • “yarn application -status <application_id>”命令可獲取特定應(yīng)用程序的詳細狀態(tài)信息;

  • “yarn logs -applicationId <application_id>”命令可查看應(yīng)用程序日志等。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

3. Yarn REST API:Yarn還提供了REST API接口,允許通過發(fā)送HTTP請求來獲取任務(wù)的狀態(tài)和其他相關(guān)信息??梢允褂肏TTP客戶端(如curl、Postman)向適當(dāng)?shù)腁PI端點發(fā)送請求,并解析響應(yīng)以獲取任務(wù)的監(jiān)控數(shù)據(jù)。

curl -X GET http://localhost:8088/ws/v1/cluster/apps/<application_id>/state

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

4.Yarn日志:Yarn會記錄任務(wù)執(zhí)行過程中的日志信息??梢酝ㄟ^查看任務(wù)的日志文件,了解任務(wù)的執(zhí)行情況、事件發(fā)生時間和錯誤信息等。任務(wù)日志會記錄在每個NodeManager上,并在任務(wù)完成后上傳到hdfs上的指定目錄中。

#查看hdfs上的日志文件
hdfs dfs -get /tmp/logs/$username/logs/application_xxx

#nm本地日志文件
#1.登錄到運行YARN作業(yè)的主節(jié)點(namenode)
#2.打開 Hadoop配置文件 yarn-site.xml,并找到以下屬性:yarn.nodemanager.log-dirs,指示NodeManager在本地的存儲路徑

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

2.3. yarn容錯機制

當(dāng)任務(wù)出現(xiàn)錯誤或容器出現(xiàn)故障時,錯誤處理和容錯配置可以幫助應(yīng)用程序更好地處理錯誤和異常情況,保證任務(wù)的正常執(zhí)行。針對任務(wù)或容器出現(xiàn)錯誤或異常情況時,可通過以下的錯誤處理和容錯配置來實現(xiàn):

  1. 容器級別的錯誤處理和容錯配置:容器級別的錯誤處理和容錯配置主要包括容器的重啟次數(shù)、重啟的時間間隔和日志的輸出等方面。通過配置容器的重試次數(shù)和時間間隔等參數(shù),可以實現(xiàn)容器故障自動重啟和容錯處理。同時,通過集成容器的日志內(nèi)容,可以了解到容器在執(zhí)行過程中的詳細情況,便于出現(xiàn)異常時定位和解決問題。

  2. 應(yīng)用程序級別的錯誤處理和容錯配置:應(yīng)用程序級別的錯誤處理和容錯配置主要包括單個任務(wù)的執(zhí)行錯誤處理、多個任務(wù)的執(zhí)行錯誤容忍、多個任務(wù)的執(zhí)行順序控制等。通過這些配置,可以使應(yīng)用程序在多個任務(wù)并行執(zhí)行時,自動容錯并協(xié)調(diào)任務(wù)的執(zhí)行順序,從而合理利用資源和提高任務(wù)執(zhí)行效率。

需要注意的是,在進行錯誤處理和容錯配置時,應(yīng)仔細分析異常和故障的原因和頻率,以合理地設(shè)置重試次數(shù)和時間間隔等參數(shù),并確保日志輸出方式和日志分析方法的正確性和有效性。

適當(dāng)?shù)剡M行錯誤處理和容錯配置,可以有效地解決任務(wù)執(zhí)行過程中出現(xiàn)的異常和位置問題,提高任務(wù)執(zhí)行效率和可靠性。

3. 資源管理

3.1. 節(jié)點管理和資源分配

  1. 節(jié)點注冊和心跳機制

    • NodeManager在啟動時向資源管理器(ResourceManager)注冊自己,并定期發(fā)送心跳以保持與資源管理器的通信。

    • 心跳包含節(jié)點狀態(tài)、可用資源和運行容器等信息,幫助資源管理器進行節(jié)點健康監(jiān)測和資源調(diào)度。

  1. 資源容量計算和分配

    • 資源管理器根據(jù)每個節(jié)點注冊的資源信息,計算出整個集群的總資源容量。

    • 在分配資源給應(yīng)用程序之前,資源管理器會考慮已分配的資源、隊列配置和其他策略,進行資源分配決策。

  1. 節(jié)點黑名單管理

    • Yarn提供了黑名單機制來解決節(jié)點故障或不可靠節(jié)點的問題。

    • 當(dāng)節(jié)點出現(xiàn)故障或無法達到預(yù)期性能時,可以添加節(jié)點到黑名單,資源管理器將不再向其分配任務(wù),以避免任務(wù)失敗或延遲。

3.2. 資源隔離和限制

  1. CPU資源管理

    • YARN使用CPU資源管理來控制和分配集群中的處理器資源。

    • 它通過預(yù)先設(shè)置的CPU配額或優(yōu)先級來限制每個應(yīng)用程序或任務(wù)可以使用的CPU核心數(shù)量。

    • 資源調(diào)度器會根據(jù)預(yù)定義的調(diào)度策略和調(diào)度規(guī)則將CPU資源分配給不同的應(yīng)用程序,確保公平和合理的資源分配。

  1. 內(nèi)存資源管理

    • YARN采用內(nèi)存資源管理機制,以控制和分配集群中的內(nèi)存資源。

    • 它使用內(nèi)存配額和限制來確保每個應(yīng)用程序或任務(wù)能夠獲得足夠的內(nèi)存,并避免超出分配的內(nèi)存限制。

    • ResourceManager會跟蹤可用的內(nèi)存資源,并根據(jù)應(yīng)用程序的需求進行內(nèi)存分配。此外,動態(tài)內(nèi)存調(diào)整功能使應(yīng)用程序能夠根據(jù)需要增加或釋放內(nèi)存資源。

  1. 網(wǎng)絡(luò)和磁盤資源管理

    • YARN還提供了網(wǎng)絡(luò)資源管理和磁盤資源管理的機制,以確保應(yīng)用程序可靠地訪問網(wǎng)絡(luò)和磁盤資源。

    • 網(wǎng)絡(luò)資源管理涉及網(wǎng)絡(luò)帶寬的配額和分配,以避免應(yīng)用程序之間的網(wǎng)絡(luò)擁塞和競爭。

    • 磁盤資源管理關(guān)注應(yīng)用程序?qū)Υ疟PI/O的訪問。YARN可以限制每個應(yīng)用程序或任務(wù)可以使用的磁盤空間,并防止它們相互干擾。

通過這些資源隔離和限制的措施,YARN能夠在集群中有效地管理和分配CPU、內(nèi)存、網(wǎng)絡(luò)和磁盤等資源。這使得不同的應(yīng)用程序能夠并行地運行在同一個集群上,而不會相互干擾或搶占資源,從而提高了整體的資源利用率和系統(tǒng)的穩(wěn)定性。

3.3. 資源調(diào)度器

目前,Hadoop作業(yè)調(diào)度器主要有三種:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop 默認的資源調(diào)度器是Capacity Scheduler。CDH框架默認調(diào)度器是Fair Scheduler。

3.3.1. 先進先出調(diào)度器(FIFO)

先進先出:單隊列,根據(jù)提交作業(yè)的先后順序,先來先服務(wù)。同一時間隊列中只有一個任務(wù)在執(zhí)行。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

優(yōu)點:簡單易懂;

缺點:不支持多隊列,生產(chǎn)環(huán)境很少使用

3.3.2. 容量調(diào)度器(Capacity Scheduler)

多隊列:每個隊列內(nèi)部先進先出, 同一時間隊列中只有一個任務(wù)在執(zhí)行, 隊列的并行度為隊列的個數(shù)。

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

容量調(diào)度器支持多個隊列,每個隊列可配置一定的資源量,每個隊列采用FIFO調(diào)度策略;

支持多用戶共享集群和多應(yīng)用程序同時運行。為了防止同一個用戶的作業(yè)獨占隊列中的資源,該調(diào)度器會對同一用戶提交的作業(yè)所占資源進行限定

  • 首先,計算每個隊列中正在運行的任務(wù)數(shù)與其應(yīng)該分得的計算資源之間的比值,選擇一個該比值最小的隊列(即最閑的);

  • 其次,按照作業(yè)優(yōu)先級和提交時間的順序,同時考慮用戶資源量限制和內(nèi)存限制對隊列內(nèi)任務(wù)排序。

如上圖,三個隊列同時按照任務(wù)的先后順序依次執(zhí)行,比如:job11,job21和job31分別排在隊列最前面,先運行,也是并行運行。

3.3.3. 公平調(diào)度器(Fair Scheduler)

多隊列:每個隊列內(nèi)部按照缺額大小分配資源啟動任務(wù),同一時間隊列中有多個任務(wù)執(zhí)行。隊列的并行度大于等于隊列的個數(shù)

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

  1. 與容量調(diào)度器相同點

    1. 多隊列:支持多隊列多作業(yè)

    2. 容量保證:管理員可為每個隊列設(shè)置資源最低保證和資源使用上線

    3. 靈活性:如果一個隊列中的資源有剩余,可以暫時共享給那些需要資源的隊列,而一旦該隊列有新的應(yīng)用程序提交,則其他隊列借調(diào)的資源會歸還給該隊列。

    4. 多租戶:支持多用戶共享集群和多應(yīng)用程序同時運行;為了防止同一個用戶的作業(yè)獨占隊列中的資源,該調(diào)度器會對同一用戶提交的作業(yè)所占資源量進行限定。

2. 與容量調(diào)度器不同點

    • 核心調(diào)度策略不同

    • 容量調(diào)度器:優(yōu)先選擇資源利用率低的隊列

    • 公平調(diào)度器:優(yōu)先選擇對資源的缺額比例大的

    • 每個隊列可以單獨設(shè)置資源分配方式

    • 容量調(diào)度器:FIFO、 DRF

    • 公平調(diào)度器:FIFO、FAIR、DRF

公平調(diào)度器設(shè)計目標(biāo)是:在時間尺度上,所有作業(yè)獲得公平的資源。某一時刻一個作業(yè)應(yīng)獲資源和實際獲取資源的差距叫“缺額” 。調(diào)度器會優(yōu)先為缺額大的作業(yè)分配資源 。

3.3.3.1. 公平調(diào)度器隊列資源分配方式

1)FIFO策略

公平調(diào)度器每個隊列資源分配策略如果選擇FIFO的話,此時公平調(diào)度器相當(dāng)于上面講過的容量調(diào)度器。

2)Fair策略

Fair 策略(默認)是一種基于最大最小公平算法實現(xiàn)的資源多路復(fù)用方式,默認情況下,每個隊列內(nèi)部采用該方式分配資源。這意味著,如果一個隊列中有兩個應(yīng)用程序同時運行,則每個應(yīng)用程序可得到1/2的資源;如果三個應(yīng)用程序同時運行,則每個應(yīng)用程序可得到1/3的資源。

3)DRF策略

DRF(Dominant Resource Fairness),我們之前說的資源,都是單一標(biāo)準,例如只考慮內(nèi)存(也是Yarn默認的情況)。但是很多時候我們資源有很多種,例如內(nèi)存,CPU,網(wǎng)絡(luò)帶寬等,這樣我們很難衡量兩個應(yīng)用應(yīng)該分配的資源比例。

那么在YARN中,我們用DRF來決定如何調(diào)度:假設(shè)集群一共有100 CPU和10T 內(nèi)存,而應(yīng)用A需要(2 CPU, 300GB),應(yīng)用B需要(6 CPU,100GB)。則兩個應(yīng)用分別需要A(2%CPU, 3%內(nèi)存)和B(6%CPU, 1%內(nèi)存)的資源,這就意味著A是內(nèi)存主導(dǎo)的, B是CPU主導(dǎo)的,針對這種情況,我們可以選擇DRF策略對不同應(yīng)用進行不同資源(CPU和內(nèi)存)的一個不同比例的限制。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- https://community.cloudera.com/t5/Support-Questions/Unable-to-start-Node-Manager/td-p/285976 -->
<!-- TODO 這個只是我從好未來集群上抄的配置 實際配置QQ還沒給我 -->
<allocations>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<queue name="default">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="users" type="parent">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<queue name="dr_dot_who" type="parent">
<maxRunningApps>0</maxRunningApps>
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
</queue>
</queue>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queuePlacementPolicy>
<rule name="specified" create="true"/>
<rule name="nestedUserQueue">
<rule name="default" create="true" queue="users"/>
</rule>
<rule name="default"/>
</queuePlacementPolicy>
</allocations>

#當(dāng)一個應(yīng)用程序提交時,它將首先被匹配到specified規(guī)則,如果沒有匹配的則被路由到nestedUserQueue規(guī)則,再沒有匹配的則被放置到default規(guī)則對應(yīng)的隊列

淺談yarn的任務(wù)管理與資源管理(yarn任務(wù)運行的幾種狀態(tài))

3.3.3.2. 配置資源使用限制

場景:在使用hdfsimporter導(dǎo)入數(shù)據(jù)時、distcp遷移hdfs數(shù)據(jù)時或者執(zhí)行數(shù)據(jù)去重、刪除等操作,為了避免資源爭搶,影響數(shù)據(jù)導(dǎo)入性能,可以通過配置調(diào)度策略,為指定隊列、應(yīng)用或用戶設(shè)置適當(dāng)?shù)馁Y源限制和配額,確保我們的數(shù)據(jù)導(dǎo)入的作業(yè)優(yōu)先獲得資源。

#限制運行在"users"隊列下 Application-Name 為 "HdfsImporter-*" 的程序資源使用上限
<allocations>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<queue name="default">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="users" type="parent">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>

<!-- 添加以下配置 -->
<rule name="HdfsImporterLimit">
<applicationName>HdfsImporter-*</applicationName>
<maxResources>2048mb,2vcores</maxResources>
</rule>

<queue name="dr_dot_who" type="parent">
<maxRunningApps>0</maxRunningApps>
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
</queue>
</queue>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queuePlacementPolicy>
<rule name="specified" create="true"/>
<rule name="nestedUserQueue">
<rule name="default" create="true" queue="users"/>
</rule>
<rule name="default"/>
</queuePlacementPolicy>
</allocations>

#限制運行在"users"隊列下的Flink應(yīng)用程序的資源使用
<allocations>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<queue name="default">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="users" type="parent">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>

<!-- 添加以下配置 -->
<rule name="FlinkLimit">
<type name="flink">
<maxResources>8192mb,8vcores</maxResources>
</type>
</rule>

<queue name="dr_dot_who" type="parent">
<maxRunningApps>0</maxRunningApps>
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
</queue>
</queue>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queuePlacementPolicy>
<rule name="specified" create="true"/>
<rule name="nestedUserQueue">
<rule name="default" create="true" queue="users"/>
</rule>
<rule name="default"/>
</queuePlacementPolicy>
</allocations>

#限定 用戶名為 "HdfsUser" 的用戶最大資源分配
<allocations>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<queue name="default">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
<queue name="users" type="parent">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>

<!-- 添加以下配置 -->
<rule name="HdfsUserLimit">
<username>HdfsUser</username>
<maxResources>3096mb,3vcores</maxResources>
</rule>

<queue name="dr_dot_who" type="parent">
<maxRunningApps>0</maxRunningApps>
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
</queue>
</queue>
</queue>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queuePlacementPolicy>
<rule name="specified" create="true"/>
<rule name="nestedUserQueue">
<rule name="default" create="true" queue="users"/>
</rule>
<rule name="default"/>
</queuePlacementPolicy>
</allocations>

4. Yarn常用命令

Yarn狀態(tài)的查詢,除了可以在yarn web頁面查看外,還可以通過命令操作。常見的命令操作如下

4.1.1. yarn application查看任務(wù)

#列出所有Application
yarn application -list

#根據(jù)Application狀態(tài)過濾
yarn application -list -appStates (所有狀態(tài):ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)
例:yarn application -list -appStates FINISHED

#Kill掉 指定Application
yarn application -kill application_1612577921195_0001

4.1.2. yarn logs查看日志

#查詢Application日志
yarn logs -applicationId <ApplicationId>

#查詢Container日志
yarn logs -applicationId <ApplicationId> -containerId <ContainerId>
例:yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001

4.1.3. yarn applicationattempt查看嘗試運行的任務(wù)

#列出所有Application嘗試的列表
yarn applicationattempt -list <ApplicationId>

#打印ApplicationAttemp狀態(tài)
yarn applicationattempt -status <ApplicationAttemptId>

4.1.4. yarn container查看容器

#列出所有Container
yarn container -list <ApplicationAttemptId>

#打印Container狀態(tài):yarn container -status <ContainerId>
#注:只有在任務(wù)跑的途中才能看到container的狀態(tài)

4.1.5. yarn node查看節(jié)點狀態(tài)

#列出所有節(jié)點
yarn node -list -all
#列出節(jié)點資源使用情況
yarn node -list -showDetails

4.1.6. yarn rmadmin更新配置

#加載隊列配置
yarn rmadmin -refreshQueues

4.1.7. yarn queue查看隊列

#查看YARN隊列的列表
#hadoop2.x
yarn queue -list

#hadoop3.x
mapred queue -list

#打印隊列信息
yarn queue -status <QueueName>

5. 問題排查

5.1. 排查思路

當(dāng)遇到 yarn 任務(wù)運行異常情況時,不同的任務(wù)狀態(tài)可能需要采取不同的排查方法。下面是針對不同狀態(tài)的一些常見排查方法:

  1. 任務(wù)提交失?。⊿ubmission Failure):

    • 檢查網(wǎng)絡(luò)連接:確保與 YARN 集群的網(wǎng)絡(luò)連接正常。嘗試 ping 集群主機以驗證連接是否通暢。

    • 檢查配置文件:檢查任務(wù)的配置文件是否正確設(shè)置,在提交任務(wù)之前,特別是檢查集群和隊列的配置。

  1. 任務(wù)啟動失?。↗ob Initialization Failure):

    • 檢查輸入/輸出路徑:確保任務(wù)所需的輸入/輸出路徑存在且權(quán)限正確。

    • 檢查日志:查看任務(wù)的日志輸出,尤其是初始化階段的錯誤日志。

    • 檢查資源配額:確認任務(wù)所需的資源配額是否可用??赡苄枰黾尤蝿?wù)的資源配額。

  1. 任務(wù)運行失?。↗ob Execution Failure):

    • 檢查任務(wù)日志:仔細查看日志,尋找具體的錯誤信息和異常堆棧跟蹤。

    • 檢查依賴項:確認任務(wù)所需的依賴項已正確安裝,并且版本匹配。

    • 檢查資源限制:確保集群資源足夠滿足任務(wù)的需求??赡苄枰黾淤Y源配額或更換較大的集群。

  1. 任務(wù)超時(Job Timeout):

    • 檢查任務(wù)復(fù)雜性:確保任務(wù)的運行時間不超過了集群的限制。嘗試優(yōu)化任務(wù)以減少其運行時間。

    • 檢查資源配置:確認任務(wù)所需的資源配置是否合理,可能需要調(diào)整資源分配。

    • 檢查網(wǎng)絡(luò)延遲:排查集群與外部系統(tǒng)之間的網(wǎng)絡(luò)延遲是否超過了任務(wù)的超時設(shè)置。

  1. 任務(wù)被殺死(Job Killed):

    • 檢查資源限制:確認任務(wù)所需的資源配額是否超過了集群的限制。嘗試增加資源配額或更換較大的集群。

    • 檢查任務(wù)優(yōu)先級:確保任務(wù)的優(yōu)先級適當(dāng),以便在集群資源緊張時能夠得到足夠的資源支持。

    • 檢查管理員操作:確定是否有管理員手動終止了任務(wù)。聯(lián)系管理員以獲取更多信息。

總之,在排查 yarn 任務(wù)異常情況時,首先關(guān)注任務(wù)的狀態(tài)和錯誤日志,根據(jù)具體情況采取相應(yīng)的排查方法。調(diào)試和日志記錄是解決問題的重要手段,同時需要注意集群配置和資源限制等因素。如果問題仍然存在,尋求相關(guān)技術(shù)支持或社區(qū)的幫助可能也是一個好的選擇。

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
在線咨詢
分享本頁
返回頂部