MapReduce On Yarn和MapReduce程序區別
MapReduce On Yarn(由專業人員開發)
1 爲MapReduce做業運行在YARN上提供一個通用的運行時環境
2 須要與Yarn的各個服務交互(包括ResourceManager,NodeManager),完成較爲複雜的功能(比方資源申請,跟對應的NodeManager通訊啓動任務)
3 由客戶端和ApplicationMaster兩部分組成。
備註:
一般不須要開發,由於MapRed Storm, Spark等都提供了已經寫好了組件。
可是若是有新的運行框架,須要運行在yarn上,則須要本身編寫配套的組件了。
對開發者要求:
1 只能用java開發
2 熟悉hadoop RPC原理及使用方法
3 熟悉分佈式系統調試方法
MapReduce程序(由普通用戶開發)
1 用戶使用編程API(包括新舊兩種)編寫的應用程序
2 由Mapper,Reducer,Combiner等組件構成
3 程序提交到YARN上後,將由已經寫好的ApplicationMaster服務對其進行分解和調度
如何編寫一個MapReduce On Yarn呢?開發流程(如圖所示)
備註:
用戶須要開發的是Client和Application Master
client須要與ResourceManager和ApplicationMaster<=>交互<=>
ApplicationMaster與ResourceManager和NodeManager<=>交互<=>
這中間須要三個Hadoop RPC協議
ApplicationClientProtocol:這個是client與ResourceManager RPC通訊的協議
Client經過該協議將應用程序提交到ResourceManager上,查詢應用程序的運行狀態或者殺死應用程序等
ApplicationMasterProtocol:ApplicationMaster與NodeManager
ApplicationMaster使用該協議向ResourceManager註冊,申請資源,獲取各個任務運行狀況等。
ContainerManagmentProtocol:ApplicationMaster與ResourceManager
ApplicationMaster使用該協議要求NodeManager啓動/撤銷Container,或者查詢Container的運行狀態。
假設client和AppMaster已經開發完畢:
第一步 client內部會將依賴的jar包傳送到hdfs
第二步 將做業提交到ResourceManager
第三步:ResourceManager收到做業後啓動你所寫的ApplicationMaster,由你的main函數來執行,通訊Resourcemanager申請資源,申請到資源後再跟nodemanager通訊來啓動task
客戶端設計流程(2個步驟)
步驟1:Client經過RPC函數
ApplicationClientProtocol#getNewApplication從ResourceManager中獲取惟一的Application ID
步驟2:Client經過RPC函數
填充必定應用程序的信息:好比ApplicationMaster須要多少資源,ApplicationMaster運行jar包是什麼,啓動命令是什麼等等
ApplicationClientProtocol#submitApplication【全部信息都封裝在這個參數裏】將ApplicationMaster提交到ResourceManager上。
ApplicationMaster的編寫分兩步,每一步分三個步驟:
一AM與RM交互【主要是來申請資源】
1,ApplicationMaster經過RPC函數
ApplicationMasterProtocol#registerApplicationMaster向ResourceManager註冊;
【註冊的時候會告訴ResourceManager本身的ip端口】
【註冊完成後會返回一些信息:好比你這個Applicationmaster最多能夠獲取多少資源,你的token是什麼,】
2,ApplicationMaster經過RPC函數
ApplicationMasterProtocol#allocate向ResourceManager申請資源(以Container形式表示)
【allocate是一個RPC函數,ApplicationMaster啓動後,已經知道內部有多少個task,每一個task須要多少資源,會進行彙總,經過allocate向ResourceManager申請資源】
【allocate申請資源後,會週期性的調用allocate函數,第一:心跳,告訴Resourcemanager我還活着,第二:allocate每次調用後ResourceManager都會返回一些信息給你
比方說:你新申請到一些資源。 】
【你須要不斷的探測,有沒有獲得新的資源】
【同時若是一些task死掉了,ResourceManager也會經過allocate告訴你】
【若是你不斷的申請資源,申請到資源以後呢,ApplicationMaster會與Nodemanageer通訊來啓動對應的task】
3,ApplicationMaster經過RPC函數
【不斷的申請資源,不斷的啓動task,最後全部的task都運行完了】
ApplicationMasterProtocol#finishApplicationMaster告訴ResourceManager應用程序執行完畢,並退出。
【這時候Resourcemanager就會把Applicationmaster的信息從內存中抹掉】
二,AM與NM交互 [如下的第一和第二部是同時執行的]
1,ApplicationMaster將申請到的資源二次分配給內部的任務,並經過RPC函數ContainerManagementProtocol#startContainer與對應的
NodeManager通訊以啓動Container(【順便告訴NodeManager,這個Container,,,,,包含任務描述,資源描述等信息)
【比方拿到了1個cpu,1G內存,這裏面有10個任務,到底分配給哪一個任務呢,有必定的調度策略,這個也要由你實現,比方設計成隨便分配給某個任務,或者具備本地性的任務】
2,ApplicationMaster可經過RPC函數
ContainerManagementProtocol#getContainerStatus向NodeManager詢問Container運行狀態,一旦發現某個Container運行失敗【是有Applicationmaster發現,而不是Resourcemanager發現】,ApplicationMaster
可嘗試從新爲對應的任務申請資源
3,一旦一個Container運行完成後,ApplicationMaster能夠經過RPC函數ContainerManagementProtocol#stopContainer釋放Container
【】