yarn學習筆記
一、什麼是yarn?
yarn(yet another resource negotiator)是hadoop的叢集資源管理系統。它是在hadoop2時被引入,最初是為了改善mapreduce的實現,由於其具備較高的通用性,現用於支援多種分散式計算模式,如mapreduce、spark和Tez等,yarn為這些計算模式提供了使用叢集資源的API。
二、yarn的核心成員
1、resource manager:資源管理器,負責叢集資源的排程和分配,一個叢集只有一個。
2、node manager:節點管理器,負責實現application的啟動和節點的資源管理,node manager執行在datanode中。
3、application master:主應用,接受resource manager分配的任務,並傳達給各個node manager繼續分配和執行任務。每個應用只有一個application master,它執行在一個node manager上。
4、containers:由resource manager分配的cpu、io、網路等資源的容器。
5、job:一個map或reduce任務。
6、task:一個實際完成map或reduce工作的獨立工作單元,task執行在node manager的container中。
三、yarn應用執行機制
1、客戶端向yarn提交作業;
2、resource manager啟動application master程序;
3、resource manager為作業分配一個可用的node manager,並通知node manager啟動一個容器用於執行application master;
4、application master向resource manager申請容器中任務執行需要的資源;
5、application master通知已經申請到的node manager啟動map任務;
6、map任務完成之後,application master獲取結果並報告給resource manager,resource manager分配新的資源給application master;
7、application master通知新的node manager使用新資源啟動reduce任務;
8、reduce任務完成後,將結果輸出到hdfs;
9、application master完成任務並請求銷燬自己。
四、yarn與mapreduce1的比較
1、yarn與mapreduce1在組成上的比較:
mapreduce1 yarn
jobtracker resource manager、application master、timeline servier
tasktracker node manager
slot container
2、擴充套件性
yarn將jobtracker的資源排程和作業控制功能進行了拆分,resource manager負責資源排程,application master負責作業控制,從而降低了jobtracker時單個節點的負擔,同時突破了可擴充套件性瓶頸。
3、可用性
mapreduce1時代的jobtracker記憶體中存在大量快速變化的複雜狀態,使得當jobtracker出現故障時,想要快速恢復正常工作狀態顯得極為困難,從而難以獲取高可用性。
yarn將jobtracker的功能進行了拆分,因此可以針對resource manager和application master分別提供高可用性支援,提高了整體的可用性。
4、利用率
mapreduce1時的資源配置被靜態的劃分為了map slot和reduce slot,這樣就會出現在執行任務時,由於叢集中只有map slot可用導致的reduce任務必須等待的情況。而yarn的每個node manager管理一個資源池,一個應用能夠按需請求資源,而不是請求一個固定的slot。
五、yarn的排程器
1、FIFO排程器
FIFO排程器採用先進先出模式,應用按照序列方式依次排隊申請服務。
優點:簡單易懂,無需額外配置。
缺點:不適合共享叢集。當一個大應用正在執行時會佔用叢集中的所有資源,導致後續其他任務等待時間較長,無法在合理的時間內獲取任務的結果。
2、容量(capacity)排程器
容器排程器會預留容器中的部分資源。當一個大應用執行時不會佔據叢集中的所以資源,一個專門的預留佇列使用預留的資源處理資源佔用較小少的小作業。這樣大應用執行時間相對增加,但是能夠在較為合理的時間未小作業提供結果。
3、公平排程器
公平排程器在執行的作業之間動態平衡資源。第一個大作業啟動時會得到所有的資源,當第二個作業執行時,會分配到一半的資源,這樣每個作業都能公平的共享叢集資源。
主要注意的是:第二個資源不是實時獲取到叢集資源,而是要等到第一個作業使用的容器完成並釋放出資源之後。當小作業使用完資源並釋放之後,大作業會再次使用全部的叢集資源。這樣既保證了叢集資源的高效利用,又保證了小作業能夠在合理的時間完成。