Hadoop三大核心組件:HDFS、MapReduce和YARN
一)Yarn的概念
YARN(Yet Another Resource Negotiator,另一種資源協調者)是一個通用資源管理系統和調度平臺,可為上層應用提供統一的資源管理和調度。它的引入為集群在利用率,資源統一管理和數據共享等方面帶帶了巨大好處。
資源管理系統:集群的硬件資源,和程序運行相關,比如:內存,CPU等。
調度平臺:多個程序同時申請計算資源如何分配,調度的規則(算法)。
通用:不僅僅支持Mapredcue程序,理論上支持各種計算程序。YARN不關心你干什么,只關心你要資源,在有的情況下給你,用完了之后還給我。
可以把YARN理解為一個分布式操作系統平臺,而MapReduce等計算程序則相當于運行于操作系統之上的應用程序,YARN為這些程序提供運算所需要的資源。
二)yarn架構
yarn是如何完成這些任務的呢?我們來看它的架構圖。
ResourceManager(RM): YARN集群中的主角色,決定系統中所有應用程序之間資源分配的最終權限,即最終仲裁者。接收用戶的作業提交,并通過NM分配,管理各個機器上的計算資源。
NodeManager(NM)。YARN中的從角色,一臺機器上一個,負責管理本機器上的計算資源。根據RM命令,啟動Container容器,監視容器的資源使用情況。并且向RM主角色匯報資源使用情況。
ApplicationMaster(AM)。用戶提交的每個應用程序均包含一個AM。應用程序內的“老大”,負責程序內部各階段的資源申請,監督程序的執行情況。
ResourceManager,NodeManager 是集群物理層面的組件,ApplicationMaster(App Mstr) 是App層面的組件。 以上叫yarn的三大組件。
4臺機器,兩個客戶端。
Client: 提交程序的一端。
Container容器:每臺機器上都可能會有若干個容器,它是硬件資源的抽象。在一臺機器上運行多個程序,如何保證程序之間它們相互不干擾?通過容器。一臺機器上有很多的容器,有的容器大,有的容器小。
(三)核心流程
上面的流程圖中,有四個核心交互流程
- MR作業提交 Client-->RM
- 資源的申請 AppMaster-->RM
- MR作業狀態匯報 Container(Map|Reduce Task)-->Container(AppMaster)
- 節點的狀態匯報 NM-->RM
四)整體概述
當用戶向 YARN 中提交一個應用程序后, YARN將分兩個階段運行該應用程序 。
第一個階段是客戶端申請資源啟動運行本次程序的ApplicationMaster;
第二個階段是由ApplicationMaster根據本次程序內部具體情況,為它申請資源,并監控它的整個運行過程,直到運行完成。
五)MR提交YARN詳細流程
第1步、用戶通過客戶端向YARN中ResourceManager提交應用程序(比如hadoop jar提交MR程序);
第2步、ResourceManager為該應用程序分配第一個Container(容器),并與對應的NodeManager通信,要求
它在這個Container中啟動這個應用程序的ApplicationMaster。
第3步、ApplicationMaster啟動成功之后,首先向ResourceManager注冊并保持通信,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態(處理了百分之幾);
第4步、AM為本次程序內部的各個Task任務向RM申請資源,并監控它的運行狀態;
第5步、一旦 ApplicationMaster 申請到資源后,便與對應的 NodeManager 通信,要求它啟動任務。
第6步、NodeManager 為任務設置好運行環境后,將任務啟動命令寫到一個腳本中,并通過運行該腳本啟動任務。
第7步、各個任務通過某個 RPC 協議向 ApplicationMaster 匯報自己的狀態和進度,以讓 ApplicationMaster 隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。在應用程序運行過程中,用戶可隨時通過RPC 向 ApplicationMaster 查詢應用程序的當前運行狀態。
第8步、應用程序運行完成后,ApplicationMaster 向 ResourceManager 注銷并關閉自己。
(六)調度器策略
在理想情況下,應用程序提出的請求將立即得到YARN批準。但是實際中,資源是有限的,并且在繁忙的群集上, 應用程序通常將需要等待其某些請求得到滿足。YARN調度程序的工作是根據一些定義的策略為應用程序分配資源。
在YARN中,負責給應用分配資源的就是Scheduler,它是ResourceManager的核心組件之一。Scheduler完全專用于調度作業,它無法跟蹤應用程序的狀態。
一般而言,調度是一個難題,并且沒有一個“最佳”策略,為此,YARN提供了多種調度器和可配置的策略供選擇。
(七)三種調度器?
提供了三種調度器:
- FIFO Scheduler(先進先出調度器)
- Capacity Scheduler(容量調度器)
- Fair Scheduler(公平調度器)
Apache版本YARN默認使用Capacity Scheduler。如果需要使用其他的調度器,可以在在配置文件中去修改。具體修改的信息是:yarn-site.xml中的yarn.resourcemanager.scheduler.class進行配置。
(1)FIFO Scheduler?先進先出調度器
FIFO Scheduler是Hadoop1.x中JobTracker原有的調度器實現,此調度器在YARN中保留了下來。
FIFO Scheduler是一個先進先出的思想,即先提交的應用先運行。調度工作不考慮優先級和范圍,適用于負載較低的小規模集群。當使用大型共享集群時,它的效率較低且會導致一些問題。
FIFO Scheduler擁有一個控制全局的隊列queue,默認queue名稱為default,該調度器會獲取當前集群上所有的 資源信息作用于這個全局的queue。
優勢: 無需配置、先到先得、易于執行
壞處: 任務的優先級不會變高,因此高優先級的作業需要等待;不適合共享集群
(2)Capacity Scheduler容量調度
Capacity Scheduler容量調度是Apache Hadoop3.x默認調度策略。該策略允許多個組織共享整個集群資源,每個組織可以獲得集群的一部分計算能力。通過為每個組織分配專門的隊列,然后再為每個隊列分配一定的集群資源, 這樣整個集群就可以通過設置多個隊列的方式給多個組織提供服務了。
Capacity可以理解成一個個的資源隊列,這個資源隊列是用戶自己去分配的。隊列內部又可以垂直劃分,這樣一個組織內部的多個成員就可以共享這個隊列資源了,在一個隊列內部,資源的調度是采用的是先進先出(FIFO)策略。
(3)Fair Scheduler公平調度器?
Fair Scheduler叫做公平調度,提供了YARN應用程序公平地共享大型集群中資源的另一種方式。使所有應用在平均情況下隨著時間的流逝可以獲得相等的資源份額。
Fair Scheduler設計目標是為所有的應用分配公平的資源(對公平的定義通過參數來設置)。
公平調度可以在多個隊列間工作,允許資源共享和搶占。
如何理解公平共享?
有兩個用戶A和B,每個用戶都有自己的隊列。
- A啟動一個作業,由于沒有B的需求,它分配了集群所有可用的資源。
- 然后B在A的作業仍在運行時啟動了一個作業,經過一段時間,A,B各自作業都使用了一半的資源。
- 現在,如果B用戶在其他作業仍在運行時開始第二個作業,它將與B的另一個作業共享其資源,因此B的每個作業將擁有資源的四分之一,而A繼續將擁有一半的資源。結果是資源在用戶之間公平地共享。
(八)設置隊列,并提交任務到不同的隊列執行?
理論介紹完了,我們來看一下提交任務到不同隊列的操作步驟。
- 停止服務。 使用命令:myhadoop stop
- 進入hadoop100節點,修改配置文件hadoopcapacity-scheduler.xml(調度器),它所在的位置是:/opt/module/hadoop-3.1.3/etc/hadoopcapacity-scheduler.xml。內容修改如下:設置三個隊列:default, production, test分別占用20,60,20的資源。
?
補充的配置如下。
?<property>
????<name>yarn.scheduler.capacity.root.queues</name>
????<value>default,production,test</value>
??</property>
??<property>
????<name>yarn.scheduler.capacity.root.default.capacity</name>
????<value>20</value>
??</property>
??<property>
????<name>yarn.scheduler.capacity.root.production.capacity</name>
????<value>60</value>
??</property>
??<property>
????<name>yarn.scheduler.capacity.root.test.capacity</name>
????<value>20</value>
??</property>
- 把配置文件同步給其他機器。 對應的命令是:
xsync /opt/module/hadoop-3.1.3/etc/hadoop - 重新啟動服務。 對應的命令是: myhadoop start
- 運行wordcount任務,并手動設置提交的隊列名字。
cd /opt/module/hadoop-3.1.3/share/hadoop/mapreduce?# 切換目錄
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapred.job.queue.name=test ?/cinput /out2
上面的-Dmapred.job.queue.name=test中,test就是我們指定的運行本任務的隊列的名字。
隊列可以被看作是任務的等待區域,就像現實生活中人們排隊等待服務一樣。在 Hadoop 集群中,當有多個 MapReduce 或其他類型的任務同時提交時,這些任務會被放入不同的隊列中等待資源分配和執行。每個隊列都有自己的屬性和規則,用于控制任務的調度和資源分配。
提交任務到指定在隊列中
-Dmapred.job.queue.name=yourQueueName 設置要提交的任務運行在哪個隊列中。
hadoop jar xxx.jar mrDriver -Dmapred.job.queue.name=yourQueueName inputPath outputPath
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapred.job.queue.name=test /wcinput /outp62
6.查看結果
打開瀏覽器,輸入http://hadoop101:8088/cluster
如上的test, default就隊列的名稱。