一、Yarn產生背景
Yarn(全稱為Yet Another Resource Negotiator,譯為"另一個資源協調者")在Hadoop2.0版本中引入,其誕生是為了解決 Hadoop 1.x 架構中 MapReduce 的資源管理和計算框架耦合 的問題。簡而言之,就是之前MapReduce的資源管理和計算框架是耦合在一起的,為了解耦而設計出了Yarn。
Yarn是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,提供統一的資源管理和調度,其核心特性有以下幾點:
- 資源管理和計算框架完全解耦
- 支持多種計算框架(如MapReduce、Spark、Flink)
- 提升集羣資源利用率和擴展性
二、Yarn系統架構
ResourceManager(RM):全局資源管理器,主要包含兩個部分,資源調度器(Scheduler)和 應用管理器(Applications Manager)
資源調度器(Scheduler):不直接參與任務調度,僅根據調度策略(如Capacity Scheduler、Fair Scheduler)分配集羣資源(CPU、內存)給應用程序應用管理器(Applications Manager):接受客户端提交的應用程序(如MapReduce、Spark、Flink作業),並且為每個應用分配第一個Container以啓動 ApplicationMaster(AM),監控AM的運行狀態
NodeManager(NM):節點管理器,包含自身節點資源管理和具體任務執行
節點資源監控:定期向 RM 彙報本節點的資源使用情況(CPU、內存、磁盤)Container生命週期管理:根據 RM 和 AM 的指令,啓動或銷燬Container,確保Container正確運行
ApplicationMaster(AM):應用程序管理器,包含資源申請和任務調度,注意AM也是運行在Container中的
資源申請:向 RM 申請運行任務所需的Container(如 MapTask、Spark Executor)任務調度:拿到Container信息後,直接與對應的NM通信,由NM來啓動或停止Container,裏面就是運行具體的任務狀態彙報:向 RM 彙報應用程序進度和最終狀態(成功/失敗)
Container:資源抽象和任務執行單元(是資源的抽象概念,比如一個Container分配了2個vCore和 4GB內存,用於運行 Reduce Task)
資源封裝隔離:包含 CPU 核數、內存、網絡等資源配額,Container之間互不影響任務執行單位:每個任務(如 MapTask、Spark Executor)運行在一個獨立的Container中
三、Yarn應用提交流程(以 提交Flink作業 為例)
3.1 客户端準備並提交Flink作業
-
用户準備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 - 客户端與 RM 交互:通過flink run提交Flink作業(Flink客户端會將 Flink 作業Jar包、flink-conf.yaml和依賴庫上傳到HDFS),
RM分配資源並啓動 AM(即Flink的JobManager)
3.2 啓動ApplicationMaster(Flink的JobManager)
- RM選擇一個NodeManager來啓動AM(Flink的JobManager)
- JobManager加載HDFS上的Flink作業 JAR包、Flink配置 和 依賴
- 生成作業執行圖(JobGraph),準備調度 TaskManager
3.3 申請TaskManager
- JobManager 根據用户配置(如 -yn、-ytm)向 RM 申請容器,每個容器對應一個TaskManager實例
- RM 根據調度策略分配容器給 JobManager,
NodeManager 收到JobManager的請求後啓動 TaskManager 容器 - 每個 TaskManager 啓動時向 JobManager 註冊,並彙報 Slot 資源
3.4 作業執行
- JobManager 將作業拆分為 Task,分配到 TaskManager 的 Slot 中執行
- TaskManager 執行任務並彙報狀態
3.5 作業完成與資源釋放
- 所有任務完成後,JobManager 向 RM 發送完成信號
- 釋放所有 TaskManager 容器,JobManager(AM)退出
- 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調度器有以下幾個特性:
- 順序排隊:所有作業按提交順序排隊,依次分配資源
- 無資源隔離:這將導致大作業可能長時間佔用資源,導致小作業“餓死”
由此可見,FIFO調度器的資源利用率低,無法滿足生產環境的多團隊協作需求,一般僅用於測試環境
5.2 Capacity Scheduler
容量調度器有幾個特性:
- 隊列劃分:集羣資源劃分為多個邏輯隊列(如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>
- 彈性資源共享:若某隊列資源空閒,其他隊列可借用
由於容量調度器的資源隔離特性,可以保證關鍵業務不受其他任務影響,並且支持彈性資源共享,資源利用率高,是傳統大數據平台的主流選擇
5.3 Fair Scheduler
公平調度器主要有以下特性:
- 動態公平分配:隊列內資源按“公平份額”(Fair Share)分配,優先滿足小作業或等待時間長的作業
- 彈性資源共享:與上面的容量調度器類似
- 層級隊列:支持樹形隊列結構(如 root.queue1.subqueue)
公平調度器適用於資源彈性需求高的場景,比如需要快速響應短作業、實時任務和批處理任務同時存在等場景
六、常見問題
資源不足(作業卡在 ACCEPTED 狀態)
現象:作業長時間處於 ACCEPTED 狀態,無法啓動 ApplicationMaster(AM),並且YARN的Web UI 顯示隊列資源佔用率接近 100%
可能原因:
- 隊列配置的 capacity 不足或 maxCapacity 限制過低
- 大作業佔滿資源(單個Container申請資源量超過NM剩餘可用量)
- 物理資源不足
解決方法:
- 調整隊列配置,調高隊列的容量百分比
- 檢查Container的資源參數,如-Xmx
- 擴容yarn集羣
AM啓動失敗問題
現象:AM 容器啓動後立即退出,作業狀態變為 FAILED,日誌中報錯Container exited with non-zero exit code 1
可能原因:
- AM 進程依賴的 JAR 文件未上傳到 HDFS 或路徑錯誤
- AM 容器的內存/CPU 配置過低
解決方法:
- 確保 Flink/Spark 作業的 JAR 和依賴庫已上傳到 HDFS 正確路徑
- 增加AM資源
flink run -m yarn-cluster -yjm 2048 ... # 提高 AM 內存至 2048M
七、總結
YARN 憑藉其鬆耦合架構(支持多種計算框架)和靈活的資源管理能力,成為大數據生態的基石。無論是傳統批處理還是實時計算,YARN 都能通過其標準化接口和高可靠性,為企業提供穩定高效的計算資源支撐。