大數據之 Yarn 技術原理

Yarn 的基本介紹

Yarn 基本定義:

Apache Hadoop YARN(Yet Another Resource Negotiator, 另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可爲上層應用提供統一的資源管理和調度,它的引入爲集羣在利用率、資源統一管理和數據共享等方面帶來的巨大的好處。

YARN 在產品中的位置:

yarn 位置

圖:Yarn 在 FusionInsight 產品中的位置

YARN 是 Hadoop2.0 中的資源管理系統,它是一個通用的資源管理模塊,可爲各類應用程序提供資源管理和調度功能。

Yarn 是輕量級彈性計算平臺,除了 MapReduce 框架,還可以支持其他框架,如 Spark、Storm 等。

多種框架統一管理,共享集羣資源的優點:

  1. 資源利用率高

  2. 運維成本低

  3. 數據共享方便

YARN 的設計思路:

YARN 的設計是爲了解決 MapReduce1.0 中的一些缺陷。

  1. 存在單點故障。

  2. JobTracker“大包大攬” 導致任務過重(任務多時內存開銷大,上限 4000 節點)。

  3. 容易出現內存溢出(分配資源只考慮 MapReduce 任務數,不考慮 CPU、內存)。

  4. 資源劃分不合理(強制劃分爲 slot ,包括 Map slot 和 Reduce slot)。

Yarn 架構思路:

設計

圖:Yarn 的架構思路:將原 Job Tacker 三大功能拆分

Yarn 的組件架構

Yarn 的組件架構:

Yarn 組件架構

圖:YARN 的組件架構圖

三大組件的主要功能介紹:

(1)ResourceManager:

(2)ApplicationMaster:

(3)NodeManager:

ResourceManager:

ResourceManager(RM)是一個全局的資源管理器,負責整個系統的資源管理和分配,主要包括兩個組件,即調度器(Scheduler)和應用程序管理器(Applications Manager)。

調度器接收來自 ApplicationMaster 的應用程序資源請求,把集羣中的資源以 “容器” 的形式分配給提出申請的應用程序,容器的選擇通常會考慮應用程序所要處理的數據的位置,進行就近選擇,從而實現 “計算向數據靠攏”。

容器(Container)作爲動態資源分配單位,每個容器中都封裝了一定數量的 CPU、內存、磁盤等資源,從而限定每個應用程序可以使用的資源量。

調度器被設計成是一個可插拔的組件,YARN 不僅自身提供了許多種直接可用的調度器,也允許用戶根據自己的需求重新設計調度器。

應用程序管理器(Applications Manager)負責系統中所有應用程序的管理工作,主要包括應用程序提交、與調度器協商資源以啓動 ApplicationMaster、監控 ApplicationMaster 運行狀態並在失敗時重新啓動等。

ApplicationMaster:

ResourceManager 接收用戶提交的作業,按照作業的上下文信息以及從 NodeManager 收集來的容器狀態信息,啓動調度過程,爲用戶作業啓動一個 ApplicationMaster。

ApplicationMaster 的主要功能是:

(1)當用戶作業提交時,ApplicationMaster 與 ResourceManager 協商獲取資源,ResourceManager 會以容器的形式爲 ApplicationMaster 分配資源;

(2)把獲得的資源進一步分配給內部的各個任務(Map 任務或 Reduce 任務),實現資源的 “二次分配”;

(3)與 NodeManager 保持交互通信進行應用程序的啓動、運行、監控和停止,監控申請到的資源的使用情況,對所有任務的執行進度和狀態進行監控,並在任務發生失敗時執行失敗恢復(即重新申請資源重啓任務);

(4)定時向 ResourceManager 發送 “心跳” 消息,報告資源的使用情況和應用的進度信息;

(5)當作業完成時,ApplicationMaster 向 ResourceManager 註銷容器,執行週期完成。

NodeManager:

NodeManager 是駐留在一個 YARN 集羣中的每個節點上的代理,主要負責:

需要說明的是,NodeManager 主要負責管理抽象的容器,只處理與容器相關的事情,而不具體負責每個任務(Map 任務或 Reduce 任務)自身狀態的管理,因爲這些管理工作是由 ApplicationMaster 完成的,ApplicationMaster 會通過不斷與 NodeManager 通信來掌握各個任務的執行狀態。

YARN 的部署:

Yarn 的部署

圖:Yarn 和 Hadoop 平臺其他組件的統一部署

在集羣部署方面,YARN 的各個組件是和 Hadoop 集羣中的其他組件進行統一部署的.

Yarn 的工作流程:

工作流程

圖:YARN 的工作流程圖

Yarn 的工作流程如下:

  1. 用戶編寫客戶端應用程序,向 YARN 提交應用程序,提交的內容包括 ApplicationMaster 程序,啓動 ApplicationMaster 的命令、用戶程序等。

  2. YARN 中的 ResourceManager 負責接收和處理來自客戶端的請求,爲應用程序分配一個容器,在該容器中啓動一個 ApplicationMaster。

  3. ApplicationMaster 被創建後會首先向 ResourceManager 註冊。

  4. ApplicationMaster 採用輪詢的方式向 ResourceManager 申請資源。

  5. ResourceManager 以 “容器” 的形式向提出申請的 ApplicationMaster 分配資源。

  6. 在容器中啓動任務(運行環境、腳本)。

  7. 各個任務向 ApplicationMaster 彙報自己的狀態和進度。

  8. 應用程序運行完成後,ApplicationMaster 向 ResourceManager 的應用程序管理器註銷並關閉自己。

Yarn 框架與 MapReduce1.0 框架的對比分析

從 MapReduce1.0 框架發展到 YARN 框架,客戶端並沒有發生變化,其大部分調用 API 及接口都保持兼容,因此,原來針對 Hadoop1.0 開發的代碼不用做大的改動,就可以直接放到 Hadoop2.0 平臺上運行。

總體而言,YARN 相對於 MapReduce1.0 來說具有以下優勢:

Yarn 的發展目標:

YARN 的目標就是實現 “一個集羣多個框架”。

一個企業當中同時存在各種不同的業務應用場景,需要採用不同的計算框架。

這些產品通常來自不同的開發團隊,具有各自的資源調度管理機制。

爲了避免不同類型應用之間互相干擾,企業就需要把內部的服務器拆分成多個集羣,分別安裝運行不同的計算框架,即 “一個框架一個集羣”。

導致問題


發展

圖:在 Yarn 上部署各種計算框架

Yarn HA:

Yarn HA

圖:YARN HA 方案

Yarn 中的 ResourceManager 負責整個集羣的資源管理和任務調度,Yarn 高可用性方案通過引入冗餘的 ResourceManager 節點的方式,解決了 ResourceManager 單點故障問題。

Yarn APPMaster 容錯機制:

APP 容錯

圖:Yarn APPMaster 容錯機制

Yarn 的資源管理和任務調度

資源管理:

當前 Yarn 支持內存和 CPU 兩種資源類型的管理和分配。

每個 NodeManager 可分配的內存和 CPU 的數量可以通過配置選項設置(可在 Yarn 服務配置頁面配置)。

資源分配模型:

資源分配模型

圖:資源分配模型

容量調度器:

容量調度器的介紹:

容量調度器使得 Hadoop 應用能夠共享的、多用戶的、操作簡便的運行在集羣上,同時最大化集羣的吞吐量和利用率。

容量調度器以隊列爲單位劃分資源,每個隊列都有資源使用的下限和上限。每個用戶可以設定資源使用上限。管理員可以約束單個隊列、用戶或者作業的資源使用、支持作業優先級,但不支持搶佔。

容量調度器的特點:

容量調度器的任務選擇:

調度時,首先按照以下策略選擇一個合適隊列:

  1. 資源利用最低的隊列優先,比如同級的兩個隊列 Q1 和 Q2,它們的容量均爲 30,而 Q1 已經使用 10,Q2 已使用 12,則會優先將資源分配給 Q1.

  2. 最小隊列層級優先。例如:QueueA 與 QueueB.childQueueB,則 QueueA 優先。

  3. 資源回收請求隊列優先。

然後按以下策略選擇該任務中一個任務:

隊列資源限制:

隊列的創建是在多租戶頁面,當創建一個租戶關聯 Yarn 服務時,會創建同名的隊列。比如先創建 QueueA,QueueB 兩個租戶即對應 Yarn 兩個隊列。

隊列的資源容量(百分比)

例如,有 default,QueueA,QueueB 三個隊列,每個隊列都有一個 [隊列名].capacity 配置。

共享空閒資源:

用戶限制:

每個用戶最低資源保障(百分比)

任何時刻,一個隊列中每個用戶可使用的資源量均由一定的限制,當一個隊列中同時運行多個用戶的任務時,每個用戶的可使用資源量在一個最小值與最大值之間浮動,其中,最大值取決於正在運行的任務數據,而最小值則由 minimum-user-limit-percent 決定。

例如:設置隊列 A 的這個值爲 25,即 yarn.scheduler.capacity.root.AueueA.minimum-user-limit-percent=25,那麼隨着任務的用戶增加,隊列資源的調整如下:

用戶


每個用戶最多可使用的資源量(所在隊列容量的倍數)

queue 容量的倍數,用來設置一個 user 可以獲取更多的資源。yarn.scheduler.capacity.root.QueueD.user-limit-factor=1. 默認值爲 1,表示一個 user 獲取的資源容量不能超過 queue 配置的 capacity,無論集羣有多少空閒字眼,最多不超過 maximum-capacity。

任務限制:

Yarn 的增強特性

Yarn 動態內存管理:

動態內存管理

圖:Yarn 動態內存管理

Yarn 基於標籤調度:

標籤調度

圖:Yarn 基於標籤調度

常用維護命令

命令


常用性能調優參數:

1

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/sW2TwJKMnVX4DzhTFHPt6Q