一、YARN 初識
Apache Hadoop YARN 是開源 Hadoop 分散式處理框架中的資源管理和作業排程技術。作為 Apache Hadoop 的核心元件之一,YARN 負責將系統資源分配給在 Hadoop 叢集中執行的各種應用程式,並排程要在不同叢集節點上執行的任務。
YARN 的基本思想是將資源管理和作業排程/監視的功能分解為單獨的 daemon(守護程式),其擁有一個全域性 ResourceManager(RM) 和每個應用程式的 ApplicationMaster(AM)。應用程式可以是單個作業,也可以是作業的 DAG。
ResourceManager和 NodeManager構成了資料計算框架。 ResourceManager 是在系統中的所有應用程式之間仲裁資源的最終許可權。NodeManager 是每臺機器框架代理,負責 Containers,監視其資源使用情況(CPU,記憶體,磁碟,網路)並將其報告給 ResourceManager。
每個應用程式 ApplicationMaster 實際上是一個框架特定的庫,其任務是協調來自 ResourceManager 的資源,並與 NodeManager 一起執行和監視任務。
在 YARN 體系結構中,ResourceManager 作為守護程式執行,作為架構中的全域性的 master 角色,通常在專用計算機上執行,它在各種競爭應用程式之間仲裁可用的群集資源。ResourceManager 跟蹤群集上可用的活動節點和資源的數量,並協呼叫戶提交的應用程式應獲取哪些資源以及事件。ResourceManager 是具有此資訊的單個程式,因此它可以以共享,安全和多租戶的方式進行排程決策(例如,根據應用程式優先順序,佇列容量,ACL,資料位置等)。
當使用者提交應用程式時,將啟動名為 ApplicationMaster 的輕量級程式例項,以協調應用程式中所有任務的執行。這包括監視任務,重新啟動失敗的任務,推測性地執行慢速任務以及計算應用程式計數器的總值。ApplicationMaster 和屬於其應用程式的任務在 NodeManagers 控制的資源容器中執行。
NodeManager 有許多動態建立的資源容器。容器的大小取決於它包含的資源量,例如記憶體、CPU、磁碟和網路IO。目前,僅支援記憶體和CPU。節點上的容器數是配置引數和用於守護程式及OS的資源之外的節點資源總量(例如總CPU和總記憶體)的乘積。
ApplicationMaster 可以在容器內執行任何型別的任務。例如,MapReduce ApplicationMaster 請求容器啟動 map 或 reduce 任務,而 Giraph ApplicationMaster 請求容器執行 Giraph 任務。您還可以實現執行特定任務的自定義 ApplicationMaster
在 YARN 中,MapReduce 簡單地降級為分散式應用程式的角色(但仍然是非常流行且有用的),現在稱為MRv2。
此外,YARN 通過 ReservationSystem 支援資源預留的概念,ReservationSystem 允許使用者通過配置檔案來指定資源的時間和時間約束(例如,截止日期)的,並保留資源以確保重要作業的可預測執行。ReservationSystem 可跟蹤資源超時,執行預留的准入控制,並動態指示基礎排程程式確保預留已滿。
二、YARN 基本服務元件
YARN 總體上是 master/slave 結構,在整個資源管理框架中,ResourceManager 為 master,NodeManager 是 slave。
YARN的基本組成結構,YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等幾個元件構成。
- ResourceManager是Master上一個獨立執行的程式,負責叢集統一的資源管理、排程、分配等等;
- NodeManager是Slave上一個獨立執行的程式,負責上報節點的狀態;
- ApplicationMaster相當於這個Application的監護人和管理者,負責監控、管理這個Application的所有Attempt在cluster中各個節點上的具體執行,同時負責向Yarn ResourceManager申請資源、返還資源等;
- Container是yarn中分配資源的一個單位,包涵記憶體、CPU等等資源,YARN以Container為單位分配資源;
ResourceManager 負責對各個 NadeManager 上資源進行統一管理和排程。當使用者提交一個應用程式時,需要提供一個用以跟蹤和管理這個程式的 ApplicationMaster,它負責向 ResourceManager 申請資源,並要求 NodeManger 啟動可以佔用一定資源的任務。由於不同的 ApplicationMaster 被分佈到不同的節點上,因此它們之間不會相互影響。
Client 向 ResourceManager 提交的每一個應用程式都必須有一個 ApplicationMaster,它經過 ResourceManager 分配資源後,執行於某一個 Slave 節點的 Container 中,具體做事情的 Task,同樣也執行與某一個 Slave 節點的 Container 中。
2.1 ResourceManager
RM是一個全域性的資源管理器,叢集只有一個,負責整個系統的資源管理和分配,包括處理客戶端請求、啟動/監控 ApplicationMaster、監控 NodeManager、資源的分配與排程。它主要由兩個元件構成:排程器(Scheduler)和應用程式管理器(Applications Manager,ASM)。
(1) 排程器
排程器根據容量、佇列等限制條件(如每個佇列分配一定的資源,最多執行一定數量的作業等),將系統中的資源分配給各個正在執行的應用程式。需要注意的是,該排程器是一個“純排程器”,它從事任何與具體應用程式相關的工作,比如不負責監控或者跟蹤應用的執行狀態等,也不負責重新啟動因應用執行失敗或者硬體故障而產生的失敗任務,這些均交由應用程式相關的ApplicationMaster完成。
排程器僅根據各個應用程式的資源需求進行資源分配,而資源分配單位用一個抽象概念“資源容器”(Resource Container,簡稱Container)表示,Container是一個動態資源分配單位,它將記憶體、CPU、磁碟、網路等資源封裝在一起,從而限定每個任務使用的資源量。
(2) 應用程式管理器
應用程式管理器主要負責管理整個系統中所有應用程式,接收job的提交請求,為應用分配第一個 Container 來執行 ApplicationMaster,包括應用程式提交、與排程器協商資源以啟動 ApplicationMaster、監控 ApplicationMaster 執行狀態並在失敗時重新啟動它等。
2.2 ApplicationMaster
管理 YARN 內執行的一個應用程式的每個例項。關於 job 或應用的管理都是由 ApplicationMaster 程式負責的,Yarn 允許我們以為自己的應用開發 ApplicationMaster。
功能:
- 資料切分;
- 為應用程式申請資源並進一步分配給內部任務(TASK);
- 任務監控與容錯;
- 負責協調來自ResourceManager的資源,並通過NodeManager監視容易的執行和資源使用情況。
可以說,ApplicationMaster 與 ResourceManager 之間的通訊是整個 Yarn 應用從提交到執行的最核心部分,是 Yarn 對整個叢集進行動態資源管理的根本步驟,Yarn 的動態性,就是來源於多個Application 的 ApplicationMaster 動態地和 ResourceManager 進行溝通,不斷地申請、釋放、再申請、再釋放資源的過程。
2.3 NodeManager
NodeManager 整個叢集有多個,負責每個節點上的資源和使用。
NodeManager 是一個 slave 服務:它負責接收 ResourceManager 的資源分配請求,分配具體的 Container 給應用。同時,它還負責監控並報告 Container 使用資訊給 ResourceManager。通過和ResourceManager 配合,NodeManager 負責整個 Hadoop 叢集中的資源分配工作。
功能:NodeManager 本節點上的資源使用情況和各個 Container 的執行狀態(cpu和記憶體等資源)
- 接收及處理來自 ResourceManager 的命令請求,分配 Container 給應用的某個任務;
- 定時地向RM彙報以確保整個叢集平穩執行,RM 通過收集每個 NodeManager 的報告資訊來追蹤整個叢集健康狀態的,而 NodeManager 負責監控自身的健康狀態;
- 處理來自 ApplicationMaster 的請求;
- 管理著所在節點每個 Container 的生命週期;
- 管理每個節點上的日誌;
- 執行 Yarn 上面應用的一些額外的服務,比如 MapReduce 的 shuffle 過程;
當一個節點啟動時,它會向 ResourceManager 進行註冊並告知 ResourceManager 自己有多少資源可用。在執行期,通過 NodeManager 和 ResourceManager 協同工作,這些資訊會不斷被更新並保障整個叢集發揮出最佳狀態。
NodeManager 只負責管理自身的 Container,它並不知道執行在它上面應用的資訊。負責管理應用資訊的元件是 ApplicationMaster
2.4 Container
Container 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等,當 AM 向 RM 申請資源時,RM 為 AM 返回的資源便是用 Container 表示的。YARN 會為每個任務分配一個 Container,且該任務只能使用該 Container 中描述的資源。
Container 和叢集節點的關係是:一個節點會執行多個 Container,但一個 Container 不會跨節點。任何一個 job 或 application 必須執行在一個或多個 Container 中,在 Yarn 框架中,ResourceManager 只負責告訴 ApplicationMaster 哪些 Containers 可以用,ApplicationMaster 還需要去找 NodeManager 請求分配具體的 Container。
需要注意的是,Container 是一個動態資源劃分單位,是根據應用程式的需求動態生成的。目前為止,YARN 僅支援 CPU 和記憶體兩種資源,且使用了輕量級資源隔離機制 Cgroups 進行資源隔離。
功能:
- 對task環境的抽象;
- 描述一系列資訊;
- 任務執行資源的集合(cpu、記憶體、io等);
- 任務執行環境
三、YARN 應用提交過程
Application在Yarn中的執行過程,整個執行過程可以總結為三步:
- 應用程式提交
- 啟動應用的ApplicationMaster例項
- ApplicationMaster 例項管理應用程式的執行
具體提交過程為:
- 客戶端程式向 ResourceManager 提交應用並請求一個 ApplicationMaster 例項;
- ResourceManager 找到一個可以執行一個 Container 的 NodeManager,並在這個 Container 中啟動 ApplicationMaster 例項;
- ApplicationMaster 向 ResourceManager 進行註冊,註冊之後客戶端就可以查詢 ResourceManager 獲得自己 ApplicationMaster 的詳細資訊,以後就可以和自己的 ApplicationMaster 直接互動了(這個時候,客戶端主動和 ApplicationMaster 交流,應用先向 ApplicationMaster 傳送一個滿足自己需求的資源請求);
- 在平常的操作過程中,ApplicationMaster 根據
resource-request協議
向 ResourceManager 傳送resource-request請求
; - 當 Container 被成功分配後,ApplicationMaster 通過向 NodeManager 傳送
container-launch-specification資訊
來啟動Container,container-launch-specification資訊
包含了能夠讓Container 和 ApplicationMaster 交流所需要的資料; - 應用程式的程式碼以 task 形式在啟動的 Container 中執行,並把執行的進度、狀態等資訊通過
application-specific協議
傳送給ApplicationMaster; - 在應用程式執行期間,提交應用的客戶端主動和 ApplicationMaster 交流獲得應用的執行狀態、進度更新等資訊,交流協議也是
application-specific協議
; - 一旦應用程式執行完成並且所有相關工作也已經完成,ApplicationMaster 向 ResourceManager 取消註冊然後關閉,用到所有的 Container 也歸還給系統。
精簡版的:
- 步驟1:使用者將應用程式提交到 ResourceManager 上;
- 步驟2:ResourceManager 為應用程式 ApplicationMaster 申請資源,並與某個 NodeManager 通訊啟動第一個 Container,以啟動ApplicationMaster;
- 步驟3:ApplicationMaster 與 ResourceManager 註冊進行通訊,為內部要執行的任務申請資源,一旦得到資源後,將於 NodeManager 通訊,以啟動對應的 Task;
- 步驟4:所有任務執行完成後,ApplicationMaster 向 ResourceManager 登出,整個應用程式執行結束。
四、Resource Request 及 Container
Yarn的設計目標就是允許我們的各種應用以共享、安全、多租戶的形式使用整個叢集。並且,為了保證叢集資源排程和資料訪問的高效性,Yarn還必須能夠感知整個叢集拓撲結構。
為了實現這些目標,ResourceManager的排程器Scheduler為應用程式的資源請求定義了一些靈活的協議,通過它就可以對執行在叢集中的各個應用做更好的排程,因此,這就誕生了Resource Request和Container。
一個應用先向ApplicationMaster傳送一個滿足自己需求的資源請求,然後ApplicationMaster把這個資源請求以resource-request的形式傳送給ResourceManager的Scheduler,Scheduler再在這個原始的resource-request中返回分配到的資源描述Container。
每個ResourceRequest可看做一個可序列化Java物件,包含的欄位資訊如下:
<resource-name, priority, resource-requirement, number-of-containers>
複製程式碼
- resource-name:資源名稱,現階段指的是資源所在的host和rack,後期可能還會支援虛擬機器或者更復雜的網路結構
- priority:資源的優先順序
- resource-requirement:資源的具體需求,現階段指記憶體和cpu需求的數量
- number-of-containers:滿足需求的Container的集合
複製程式碼
ApplicationMaster在得到這些Containers後,還需要與分配Container所在機器上的NodeManager互動來啟動Container並執行相關任務。當然Container的分配是需要認證的,以防止ApplicationMaster自己去請求叢集資源。
五、YARN 配置
a). 修改檔案 YARN 配置檔案
etc/hadoop/mapred-site.xml
:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
複製程式碼
etc/hadoop/yarn-site.xml
:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
複製程式碼
b). 啟動 ResourceManager 和 NodeManager sbin/start-yarn.sh
,停止 RM 和 NM sbin/stop-yarn.sh
c). 驗證:可通過 JPS
命令來檢查是否啟動 YARN
當顯示上圖時,就表示 YARN 成功啟動了
d). 向 YARN 以 jar 包的方式提交作業,假設 jar 包為 example.jar
格式為:
hadoop jar jar包名 應用名 輸入路徑 輸出路徑
複製程式碼
例如:
hadoop jar example.jar wordccount /input/hello.txt /output/helloCount.txt
複製程式碼
參考
[1] blog.csdn.net/Mr_HHH/arti…