一、Yarn框架產生的背景與原因
我們都知道Hadoop誕生的目標是爲了支持十幾臺機器的搜索服務,但是隨着數據的增加,數據的可用性也是一個待解決的問題。但是Hadoop框架的自身問題限制了集羣的發展。
首先是,JobTracker和NameNode的單點問題,嚴重製約了集羣的擴展和可靠性。
MapReduce採用了基於slot的資源分配模型,slot是一種粗粒度的資源 劃分單位,通常一個任務不會用完槽位對應的資源,且其他任務也無法使用這些空閒資源,同時map的槽位和reduce的槽位是不可以通用的。會導致部分資源緊張,部分資源空閒。
同時爲了滿足在線計算等新的計算框架,MapReduce這種離線計算框架已經不能滿足需求。
使用Yarn可以提高資源利用率:
所有計算框架運行在一個集羣中,共享一個集羣的資源,做到按需分配
二、Yarn框架介紹
Yet Another Resource Negotiator 通用資源管理系統
可以爲上層框架提供統一的資源管理和調度
JobTracker在 YARN 中JobTracker大約分成了 3 塊:
- 一部分是 ResourceManager,負責 Scheduler 及
ApplicationsManager; - 一部分是 ApplicationMaster,負責 job 的生命週期管理;
- 最後一部分是 JobHistroyServer,負責日誌的展
示。
爲了支持更多的計算模型,把以前的 TaskTracker 替換成了 NodeManager。NodeManager 管理各種各樣的 container。Container
纔是真正幹活的。計算模型相關的事情可以放在 NodeManager 的一個擴展服務中,如 MAP-REDUCE 的 shuffle。
三、各大模塊分析
Client
可以向RM(ResourceManager)提交任務、殺死任務
ResourceManager
RM 是一個全局的資源管理器,負責整個系統的資源管理和分配,包括 scheduler 和 Application Manager, Node Manager
對調度器來說,YARN 提供了多種直接可用的調度器, Fair Scheduler 和 Capacity Scheduler 等。調度器僅根據各個應用程序的資源需求進行資源分配,分配的基本單位是Container,而容器裏面是將內存,CPU,網絡,磁盤封裝到一起。
處理來自客戶端的請求:提交、殺死
啓動/監控 AM、監控NM
同時用戶也可設計自己的調度器。
ApplicationMaster
對應用程序管理器來說,,包括應用程序提交、與調度器協商資源以啓動 ApplicationMaster、監控 ApplicationMaster 運行狀態並在失敗時重新啓動它等。用戶提交的每個應用程序均包含一個 ApplicationMaster,ApplicationMaster可以與RM協商申請獲取資源,也可以將得到的任務進行再分配,與NM通信啓動對應的Task,同時可以監控所有的任務狀態。數據切分,爲每個task向RM申請資源(在container執行),與NodeManager通信,實現任務的監控【如某個Task掛掉後需要重啓等】
NodeManager
NodeManager 管理 container、資源下載、健康檢測後彙報 對節點管理器來說,NM是每個節點上的資源和任務管理器,一方面,它會定時地向 RM 彙報本節點上的 資源使用情況和各個 Container 的運行狀態;另一方面,它接收並處理來自 AM 的 Container 啓動 / 停止等各種請求。
Container
Container 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如內存、 CPU、磁盤、網絡等,當 AM 向 RM 申請資源時,RM 爲 AM 返回的資源便是用 Container 表示的。YARN 會爲每個任務分配一個 Container,且該任務只能使用該 Container 中描述的 資源。容器是一個動態劃分資源。
Jobhistory 機制
在 MRv1 中,JobHistroy server 是嵌入在 Jobtracker 中的,當有大量的查詢 時,對 Jobtracker 造成很大的壓力.Yarn中實現一套單獨的 JobHistroy server 服務。AggregatedLogDeletionService:日誌文件的 管理。 HistoryClientService:提供一些服務供 JobClient 查詢。
四、Yarn工作流程
- 1.客戶端Client 向 YARN 中提交應用程序,其中包括 ApplicationMaster 程序、啓動 ApplicationMaster 的命令、用戶程序等。
- 2.ResourceManager 爲該應用程序分配第一個 Container,並與對應的 NodeManager 通信,要求它在這個 Container 中啓動應用程序的 ApplicationMaster。
- 3 ApplicationMaster 首先向 ResourceManager 註冊,這樣用戶可以直接通過 ResourceManage 查看應用程序的運行狀態,然後它將爲各個任務申請資源,並監控它的運行狀態,直到運行結束,即重複步驟 4~7。
- 4 ApplicationMaster 採用輪詢的方式通過 RPC 協議向 ResourceManager 申請和領取資源。
- 5. 一旦 ApplicationMaster 申請到資源後,便與對應的 NodeManager 通信,要求它啓動任務。
- 6. NodeManager 爲任務設置好運行環境(包括環境變量、JAR 包、二進制程序 等)後,將任務啓動命令寫到一個腳本中,並通過運行該腳本啓動任務。
- 7. 各個任務通過某個 RPC 協議向 ApplicationMaster 彙報自己的狀態和進度,以讓 ApplicationMaster 隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務。 在應用程序運行過程中,用戶可隨時通過 RPC 向 ApplicationMaster 查詢應用程序的當前運行狀態。
- 8. 應用程序運行完成後, ApplicationMaster 向 ResourceManager 註銷並關閉自己。
五、Yarn集羣配置
node manager在物理上應該跟data node部署在一起
resource manager在物理上應該獨立部署在一臺專門的機器上
cd /root/apps/hadoop-2.8.5/etc/hadoop
1、修改配置文件:
vi yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hdp-01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
其中,名稱yarn.resourcemanager.hostname指的是運行ResourceManager機器所在的節點位置;名稱yarn.nodemanager.aux-services在hadoop2.2.0版本中是mapreduce_shuffle,一定要看清楚。
修改mapred-site.xml,內容如下(默認是template後綴結尾,去掉後綴改爲xml即可)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
其中,名稱mapreduce.framework.name指的是使用yarn運行mapreduce程序。
啓動了HDFS之後,就可以啓動yarn了。執行命令start-yarn.sh即可啓動MapReduce集羣。
- scp這個yarn-site.xml到其他節點
scp yarn-site.xml hdp-02:$PWD scp yarn-site.xml hdp-03:$PWD
- 啓動yarn集羣:start-yarn.sh (注:該命令應該在resourcemanager所在的機器上執行)
- 用jps檢查yarn的進程,用web瀏覽器查看yarn的web控制檯
http://hdp-01:8088
關於參數yarn-site.xml 修改
http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
六、MapReduce程序在Yarn啓動-運行-註銷全流程
本文部分參考文章:https://www.jianshu.com/p/bac54467ac3a