低版本的hadoop下MapReduce處理流程
1、首先用戶程序(JobClient)提交了一個job,job的信息會發送到Job Tracker,Job Tracker是Map-reduce框架的中心,他需要與集群中的機器定時通信heartbeat,需要管理哪些程序應該跑在哪些機器上,需要管理所有job失敗、重啟等操作。
2、TaskTracker是Map-Reduce集群中每台機器都有的一個部分,他做的事情主要是監視自己所在機器的資源情況。
3、TaskTracker同時監視當前機器的tasks運行狀況。TaskTracker需要把這些信息通過heartbeat發送給JobTracker,JobTracker會搜集這些信息以給新提交的job分配運行在哪些機器上。
但是隨着集群規模個工作負荷的增長,原框架的問題便暴露出來了。
1、JobTracker是Map-reduce的集中處理點,存在單點故障
2、JobTracker完成了太多的任務,造成了過多的資源消耗,當map-reduce job非常多的時候,會造成很大的內存開銷,潛在來說,也增加了JobTracker fail的風險,這也是業界普遍總結出老hadoop 的Map-Reduce只能支持4000節點主機的上限。
3、在TaskTracker端,以map/reduce task的數目作為資源的表示過於簡單,沒有考慮到cpu/內存的占用情況,如果兩個大內存消耗的task被調度到了一塊,很容易出現OOM
4、在TaskTracker端,把資源強制划分為map task slot和reduce task slot如果當系統中只有map task或者只有reduce task的時候,會造成資源的浪費,也就是前面提到過的集群資源利用的問題。
5、源代碼非常難讀,因為一個類做了太多的事情,而代碼量過多,造成class的任務不清晰,增加bug的修復和版本維護的難讀。
新hadoop yarn框架原理及運行機制
為了從根本上解決舊的MapReduce框架的性能瓶頸,促進Hadoop框架的更長遠發展,從0.23.0版本開始,Hadoop的MapReduce框架完全重構,叫做MapReduceV2或者Yarn.
基本思想就是將JobTracker兩個主要的功能分分離成單獨的組件,這兩個功能是資源管理和任務調度/監控。新的資源管理器全局管理所有應用程序計算資源的分配。每一個應用的ApplicationMaster負責相應的調度和協調。一個應用程序無非是一個單獨的傳統的MapReduce任務或者是一個DAG(有向無環圖)任務。ResourceManager和每一台機器的階段管理服務器能夠管理用戶在哪台機器上的進程並能對計算進行組織。
事實上,每一個應用的ApplicationMaster是一個詳細的框架庫,它結合從ResourceManager獲得的資源和NedoManager協同工作運行和監控任務。
ResourceManager支持分層級的應用隊列,這些隊列享有集群一定比例的資源。從某種意義上講他就是一個純粹的調度器,它在執行過程中不對應用進行監控和狀態跟蹤。同樣,它也不能重啟因應用失敗或者硬件錯誤而運行失敗的任務。
ResourceManager是基於應用程序對資源的需求進行調度的;每一個應用程序需要不同類型的資源因此就需要不同的容器。資源包括:內存、CPU、磁盤、網絡等。可以看出,這同現在MapReduce固定類型的資源使用模式有顯著區別,它給集群的使用帶來負面的影響,資源管理器提供一個調度策略的插件,它負責將集群資源分配給多個隊列和應用程序,調度插件可以基於現有的能力調度和公平調度模型。
圖中NodeManager是每一台機器框架的代理,是執行應用程序的容器,監控應用程序的資源使用情況(CPU 內存 磁盤 網絡)並且向調度器匯報。
每一個應用的ApplicationMaster的職責有:向調度器索要適當的資源容器,運行任務,跟蹤應用程序的狀態和監控他們的進程,處理任務的失敗原因。
新舊Hadoop MapReduce框架對比
1、客戶端不變,其調用API及接口大部分保持兼容,這也是為了開發使用者透明化,對原碼不必做大的改變,但是原框架的JobTracker和TaskTracker不見了,取而代之的是ResourceManager AppliactionMaster NodeManager三個部分。
2、ResourceManager是一個中心的服務,它做的事情是調度、啟動每一個Job所屬的ApplicationMaster、另外監控ApplicationMaster的存在情況。Job里面所在的task的監控,重啟等內容不見了,這就是ApplicationMaster存在的原因。ResourceManager負責作業與資源的調度,接收JobSubmitter提交的作業,按照作業的上下文(context)信息,以及從NodeManager收集來的狀態信息,啟動調度過程,分配一個Container作為Application Master
3、NodeManager功能比較專一,就是負責Container狀態的維護,並向RM保持心跳。
4、ApplicationMaster負責一個Job生命周期內的所有工作,類似老的框架中JobTracker,但注意每一個Job(不是每一種)都有一個ApplicationMaster,他可以運行在ResourceManager以外的機器上.
Hadoop yarn優勢
1、大大減小了JobTracker(也就是現在的ResourceManager)的資源消耗,並且讓檢測每一個Job子任務(tasks)狀態的程序分布式化了。更安全、更優美
2、在新的Yarn中,ApplicationMaster是一個可變更的部分,用戶可以對不同的編程模型寫自己的ApplicationMaster,讓更多類型的編程模型能夠跑在Hadoop集群中。
3、對於資源的表示以內存為單位,比之前以剩余slot數目更合理
4、老的框架中,JobTracker一個很大的負擔就是監控kob下的tasks的運行狀況,現在,這個部分就扔給ApplicationMaster了,而ResourceManager中有一個模塊叫做ApplicationsMaster,它是檢測ApplicationMaster的運行狀況,如果出問題,會將其在其他機器上重啟
5、Container是Yarn為了將來做資源隔離而提出的一個框架,這一點應該借鑒了Mesos的工作,目前是一個框架,僅僅提供Java虛擬機內存的隔離,hadoop團隊的設計思路應該后續能支持更多的資源調度和控制,既然資源表示成內存量,那就沒有了之前的map slot/reduce slot分開造成集群資源閑置的尷尬情況。
配置hadoop yarn
<property> <name>yarn.resourcemanager.hostname</name> <value>www.node1.com</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>