博客 / 詳情

返回

【Hadoop】Yarn資源管理調度

一、Yarn產生背景

Yarn(全稱為Yet Another Resource Negotiator,譯為"另一個資源協調者")在Hadoop2.0版本中引入,其誕生是為了解決 Hadoop 1.x 架構中 MapReduce 的資源管理和計算框架耦合 的問題。簡而言之,就是之前MapReduce的資源管理和計算框架是耦合在一起的,為了解耦而設計出了Yarn。

Yarn是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,提供統一的資源管理和調度,其核心特性有以下幾點:

  1. 資源管理和計算框架完全解耦
  2. 支持多種計算框架(如MapReduce、Spark、Flink)
  3. 提升集羣資源利用率和擴展性

二、Yarn系統架構

image.png
ResourceManager(RM):全局資源管理器,主要包含兩個部分,資源調度器(Scheduler)和 應用管理器(Applications Manager)

  1. 資源調度器(Scheduler)不直接參與任務調度,僅根據調度策略(如Capacity Scheduler、Fair Scheduler)分配集羣資源(CPU、內存)給應用程序
  2. 應用管理器(Applications Manager):接受客户端提交的應用程序(如MapReduce、Spark、Flink作業),並且為每個應用分配第一個Container以啓動 ApplicationMaster(AM),監控AM的運行狀態

NodeManager(NM):節點管理器,包含自身節點資源管理和具體任務執行

  1. 節點資源監控:定期向 RM 彙報本節點的資源使用情況(CPU、內存、磁盤)
  2. Container生命週期管理:根據 RM 和 AM 的指令,啓動或銷燬Container,確保Container正確運行

ApplicationMaster(AM):應用程序管理器,包含資源申請和任務調度,注意AM也是運行在Container中的

  1. 資源申請:向 RM 申請運行任務所需的Container(如 MapTask、Spark Executor)
  2. 任務調度:拿到Container信息後,直接與對應的NM通信,由NM來啓動或停止Container,裏面就是運行具體的任務
  3. 狀態彙報:向 RM 彙報應用程序進度和最終狀態(成功/失敗)

Container:資源抽象和任務執行單元(是資源的抽象概念,比如一個Container分配了2個vCore和 4GB內存,用於運行 Reduce Task)

  1. 資源封裝隔離:包含 CPU 核數、內存、網絡等資源配額,Container之間互不影響
  2. 任務執行單位每個任務(如 MapTask、Spark Executor)運行在一個獨立的Container中

三、Yarn應用提交流程(以 提交Flink作業 為例)

3.1 客户端準備並提交Flink作業

  1. 用户準備Flink作業:包括Flink的作業Jar包,配置Flink的參數(並行度、內存)

    # Per-Job 模式
    flink run -m yarn-cluster -yn 2 -ys 4 -yjm 1024 -ytm 2048 flink-job.jar --input hdfs:///data --output hdfs:///result
  2. 客户端與 RM 交互:通過flink run提交Flink作業(Flink客户端會將 Flink 作業Jar包、flink-conf.yaml和依賴庫上傳到HDFS),RM分配資源並啓動 AM(即Flink的JobManager)

3.2 啓動ApplicationMaster(Flink的JobManager)

  1. RM選擇一個NodeManager來啓動AM(Flink的JobManager)
  2. JobManager加載HDFS上的Flink作業 JAR包、Flink配置 和 依賴
  3. 生成作業執行圖(JobGraph),準備調度 TaskManager

3.3 申請TaskManager

  1. JobManager 根據用户配置(如 -yn、-ytm)向 RM 申請容器,每個容器對應一個TaskManager實例
  2. RM 根據調度策略分配容器給 JobManager,NodeManager 收到JobManager的請求後啓動 TaskManager 容器
  3. 每個 TaskManager 啓動時向 JobManager 註冊,並彙報 Slot 資源

3.4 作業執行

  1. JobManager 將作業拆分為 Task,分配到 TaskManager 的 Slot 中執行
  2. TaskManager 執行任務並彙報狀態

3.5 作業完成與資源釋放

  1. 所有任務完成後,JobManager 向 RM 發送完成信號
  2. 釋放所有 TaskManager 容器,JobManager(AM)退出
  3. YARN 自動刪除臨時文件(如 HDFS 上的作業 JAR 和 依賴庫)

四、Yarn常用命令

  • 任務相關
# 查看所有任務
yarn application -list

# 查看指定狀態(如ACCEPTED/RUNNING)的任務列表
yarn application -list -appStates RUNNING

# 查看指定任務詳情
yarn application -status <ApplicationID>

# 殺死指定任務
yarn application -kill <ApplicationID>
  • 節點相關
# 查看集羣節點狀態
yarn node -list
  • 日誌相關
# 查看任務日誌
yarn logs -applicationId <ApplicationID>

五、Scheduler調度策略

YARN 支持三種主要的調度策略,FIFO Scheduler(先進先出)、Capacity Scheduler(容量調度器)、Fair Scheduler(公平調度器),分別適用於不同的場景:

5.1 FIFO Scheduler

FIFO調度器有以下幾個特性:

  1. 順序排隊:所有作業按提交順序排隊,依次分配資源
  2. 無資源隔離:這將導致大作業可能長時間佔用資源,導致小作業“餓死”

由此可見,FIFO調度器的資源利用率低,無法滿足生產環境的多團隊協作需求,一般僅用於測試環境

5.2 Capacity Scheduler

容量調度器有幾個特性:

  1. 隊列劃分:集羣資源劃分為多個邏輯隊列(如prod、dev),每個隊列可以配置最低容量保障,隊列內FIFO
<property>
  <name>yarn.scheduler.capacity.root.queues</name>
  <value>prod,dev,research</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.prod.capacity</name>
  <value>60</value> <!-- prod 隊列佔 60% 資源 -->
</property>
<property>
  <name>yarn.scheduler.capacity.root.dev.capacity</name>
  <value>30</value>
</property>
  1. 彈性資源共享:若某隊列資源空閒,其他隊列可借用

由於容量調度器的資源隔離特性,可以保證關鍵業務不受其他任務影響,並且支持彈性資源共享,資源利用率高,是傳統大數據平台的主流選擇

5.3 Fair Scheduler

公平調度器主要有以下特性:

  1. 動態公平分配:隊列內資源按“公平份額”(Fair Share)分配,優先滿足小作業或等待時間長的作業
  2. 彈性資源共享:與上面的容量調度器類似
  3. 層級隊列:支持樹形隊列結構(如 root.queue1.subqueue)

公平調度器適用於資源彈性需求高的場景,比如需要快速響應短作業、實時任務和批處理任務同時存在等場景

六、常見問題

資源不足(作業卡在 ACCEPTED 狀態)

現象:作業長時間處於 ACCEPTED 狀態,無法啓動 ApplicationMaster(AM),並且YARN的Web UI 顯示隊列資源佔用率接近 100%

可能原因:

  1. 隊列配置的 capacity 不足或 maxCapacity 限制過低
  2. 大作業佔滿資源(單個Container申請資源量超過NM剩餘可用量)
  3. 物理資源不足

解決方法:

  1. 調整隊列配置,調高隊列的容量百分比
  2. 檢查Container的資源參數,如-Xmx
  3. 擴容yarn集羣

AM啓動失敗問題

現象:AM 容器啓動後立即退出,作業狀態變為 FAILED,日誌中報錯Container exited with non-zero exit code 1

可能原因:

  1. AM 進程依賴的 JAR 文件未上傳到 HDFS 或路徑錯誤
  2. AM 容器的內存/CPU 配置過低

解決方法:

  1. 確保 Flink/Spark 作業的 JAR 和依賴庫已上傳到 HDFS 正確路徑
  2. 增加AM資源
flink run -m yarn-cluster -yjm 2048 ... # 提高 AM 內存至 2048M

七、總結

YARN 憑藉其鬆耦合架構(支持多種計算框架)和靈活的資源管理能力成為大數據生態的基石。無論是傳統批處理還是實時計算,YARN 都能通過其標準化接口和高可靠性,為企業提供穩定高效的計算資源支撐

user avatar dewujishu 頭像 u_16213609 頭像 u_15474939 頭像 yunrizhi_daishuyun 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.