一、第一代hadoop組成與結構
第一代Hadoop,由分布式存儲系統HDFS和分布式計算框架MapReduce組成,其中,HDFS由一個NameNode和多個DataNode組成,MapReduce由一個JobTracker和多個TaskTracker組成,對應Hadoop版本為Hadoop 1.x和0.21.X,0.22.x。 ?
???
1、MapReduce角色分配
Client :作業提交發起者。
JobTracker: 初始化作業,分配作業,與TaskTracker通信,協調整個作業。
TaskTracker:保持JobTracker通信,在分配的數據片段上執行MapReduce任務。
?
2、MapReduce執行流程
?
(1)提交作業
在作業提交之前,需要對作業進行配置
程序代碼,主要是自己書寫的MapReduce程序。
輸入輸出路徑
其他配置,如輸出壓縮等。
配置完成后,通過JobClinet來提交
(2)作業的初始化
客戶端提交完成后,JobTracker會將作業加入隊列,然后進行調度,默認的調度方法是FIFO調試方式。
(3)任務的分配
TaskTracker和JobTracker之間的通信與任務的分配是通過心跳機制完成的。
TaskTracker會主動向JobTracker詢問是否有作業要做,如果自己可以做,那么就會申請到作業任務,這個任務可以使Map也可能是Reduce任務。
(4)任務的執行
申請到任務后,TaskTracker會做如下事情:
拷貝代碼到本地
拷貝任務的信息到本地
啟動JVM運行任務
(5)狀態與任務的更新
任務在運行過程中,首先會將自己的狀態匯報給TaskTracker,然后由TaskTracker匯總告之JobTracker。
任務進度是通過計數器來實現的。
(6)作業的完成
JobTracker是在接受到最后一個任務運行完成后,才會將任務標志為成功。
此時會做刪除中間結果等善后處理工作。
二、第二代hadoop組成與結構
第二代Hadoop,為克服Hadoop 1.0中HDFS和MapReduce存在的各種問題而提出的。針對Hadoop 1.0中的單NameNode制約HDFS的擴展性問題,提出了HDFS Federation,它讓多個NameNode分管不同的目錄進而實現訪問隔離和橫向擴展;針對Hadoop 1.0中的MapReduce在擴展性和多框架支持方面的不足,提出了全新的資源管理框架YARN(Yet Another Resource Negotiator),它將JobTracker中的資源管理和作業控制功能分開,分別由組件ResourceManager和ApplicationMaster實現,其中,ResourceManager負責所有應用程序的資源分配,而ApplicationMaster僅負責管理一個應用程序。對應Hadoop版本為Hadoop 0.23.x和2.x。
1、 yarn運行架構
YARN 是下一代Hadoop計算平臺,如下所示:
?
在 YARN 架構中,一個全局ResourceManager 以主要后臺進程的形式運行,它通常在一臺獨立機器上運行,在各種競爭的應用程序之間仲裁可用的集群資源。
ResourceManager會追蹤集群中有多少可用的活動節點和資源,協調用戶提交的哪些應用程序應該在何時獲取這些資源。ResourceManager是惟一擁有此信息的進程,所以它可通過某種共享的、安全的、多租戶的方式制定分配(或者調度)決策(例如,依據應用程序優先級、隊列容量、ACLs、數據位置等)。
在用戶提交一個應用程序時,一個稱為ApplicationMaster的輕量型進程實例會啟動來協調應用程序內的所有任務的執行。這包括監視任務,重新啟動失敗的任務,推測性地運行緩慢的任務,以及計算應用程序計數器值的總和。這些職責以前是分配給單個 JobTracker來完成的。ApplicationMaster和屬于它的應用程序的任務,在受NodeManager控制的資源容器中運行。
NodeManager是TaskTracker的一種更加普通和高效的版本。沒有固定數量的 map 和 reduce slots,NodeManager 擁有許多動態創建的資源容器。容器的大小取決于它所包含的資源量,比如內存、CPU、磁盤和網絡 IO。目前,僅支持內存和 CPU (YARN-3)。一個節點上的容器數量,由節點資源總量(比如總CPU數和總內存)共同決定。
需要說明的是:ApplicationMaster可在容器內運行任何類型的任務。例如,MapReduce ApplicationMaster請求一個容器來啟動map或reduce 任務,而 Giraph ApplicationMaster請求一個容器來運行Giraph任務。
我們還可以實現一個自定義的 ApplicationMaster 來運行特定的任務,進而發明出一種全新的分布式應用程序框架,改變大數據格局。
在YARN中,MapReduce降級為一個分布式應用程序的一個角色(但仍是一個非常流行且有用的角色),現在稱為 MRv2。MRv2 是經典MapReduce引擎(稱為 MRv1)的重現,運行在YARN之上。
2、YARN可運行任何分布式應用程序
ResourceManager、NodeManager 和容器都不關心應用程序或任務的類型。所有特定于應用程序框架的代碼都會轉移到ApplicationMaster,以便任何分布式框架都可以受 YARN 支持。
得益于這個一般性的方法,Hadoop YARN集群可以運行許多不同分布式計算模型,例如:MapReduce、Giraph、Storm、Spark、Tez/Impala、MPI等。
3、YARN中提交應用程序
下面討論在應用程序提交到YARN集群時,ResourceManager、ApplicationMaster、NodeManagers和容器如何相互交互。下圖顯示了一個例子。
?
假設用戶采用與MRv1中相同的方式鍵入hadoop jar命令,將應用程序提交到 ResourceManager。ResourceManager維護在集群上運行的應用程序列表,以及每個活動的 NodeManager上的可用資源列表。
ResourceManager 需要確定哪個應用程序接下來應該獲得一部分集群資源。該決策受到許多限制,比如隊列容量、ACL 和公平性。ResourceManager 使用一個可插拔的 Scheduler。Scheduler 僅執行調度;它管理誰在何時獲取集群資源(以容器的形式),但不會對應用程序內的任務執行任何監視,所以它不會嘗試重新啟動失敗的任務。
在 ResourceManager接受一個新應用程序提交時,Scheduler制定的第一個決策是選擇將用來運行ApplicationMaster的容器。在 ApplicationMaster啟動后,它將負責此應用程序的整個生命周期。首先也是最重要的是,它將資源請求發送到 ResourceManager,請求運行應用程序的任務所需的容器。
資源請求是對一些容器的請求,用以滿足一些資源需求,比如:
一定量的資源,目前使用MB內存和CPU份額來表示
一個首選的位置,由主機名、機架名稱指定
此應用程序中的一個優先級,而不是跨多個應用程序
如果可能的話,ResourceManager 會分配一個滿足ApplicationMaster在資源請求中所請求的容器(表達為容器 ID和主機名)。該容器允許應用程序使用特定主機上給定的資源量。分配一個容器后,ApplicationMaster會要求NodeManager(管理分配容器的主機)使用這些資源來啟動一個特定于應用程序的任務。此任務可以是在任何框架中編寫的任何進程(比如一個 MapReduce 任務或一個Giraph任務)。
NodeManager 不會監視任務;它僅監視容器中的資源使用情況,例如,如果一個容器消耗的內存比最初分配的更多,它會結束該容器。
ApplicationMaster會竭盡全力協調容器,啟動所有需要的任務來完成它的應用程序。它還監視應用程序及其任務的進度,在新請求的容器中重新啟動失敗的任務,以及向提交應用程序的客戶端報告進度。
應用程序完成后,ApplicationMaster 會關閉自己并釋放自己的容器。
盡管ResourceManager不會對應用程序內的任務執行任何監視,但它會檢查 ApplicationMaster的健康狀況。如果 ApplicationMaster失敗,ResourceManager 可在一個新容器中重新啟動它。我們可以認為ResourceManager負責管理ApplicationMaster,而 ApplicationMasters負責管理任務。