1. Hadoop 2.0 中的資源管理
Hadoop 2.0指的是版本為Apache Hadoop 0.23.x、2.x或者CDH4系列的Hadoop,內核主要由HDFS、MapReduce和YARN三個系統組成,其中,YARN是一個資源管理系統,負責集群資源管理和調度,MapReduce則是運行在YARN上離線處理框架,它與Hadoop 1.0中的MapReduce在編程模型(新舊API)和數據處理引擎(MapTask和ReduceTask)兩個方面是相同的。
讓我們回歸到資源分配的本質,即根據任務資源需求為其分配系統中的各類資源。在實際系統中,資源本身是多維度的,包括CPU、內存、網絡I/O和磁盤I/O等,因此,如果想精確控制資源分配,不能再有slot的概念,最直接的方法是讓任務直接向調度器申請自己需要的資源(比如某個任務可申請1.5GB 內存和1個CPU),而調度器則按照任務實際需求為其精細地分配對應的資源量,不再簡單的將一個Slot分配給它,Hadoop 2.0正式采用了這種基於真實資源量的資源分配方案。
Hadoop 2.0(YARN)允許每個節點(NodeManager)配置可用的CPU和內存資源總量,而中央調度器則會根據這些資源總量分配給應用程序。節點(NodeManager)配置參數如下:
(1)yarn.nodemanager.resource.memory-mb
可分配的物理內存總量,默認是8*1024,即8GB。
(2)yarn.nodemanager.vmem-pmem-ratio
任務使用單位物理內存量對應最多可使用的虛擬內存量,默認值是2.1,表示每使用1MB的物理內存,最多可以使用2.1MB的虛擬內存總量。
(3)yarn.nodemanager.resource.cpu-vcore
可分配的虛擬CPU個數,默認是8。為了更細粒度的划分CPU資源和考慮到CPU性能異構性,YARN允許管理員根據實際需要和CPU性能將每個物理CPU划分成若干個虛擬CPU,而每管理員可為每個節點單獨配置可用的虛擬CPU個數,且用戶提交應用程序時,也可指定每個任務需要的虛擬CPU個數。比如node1節點上有8個CPU,node2上有16個CPU,且node1 CPU性能是node2的2倍,那么可為這兩個節點配置相同數目的虛擬CPU個數,比如均為32,由於用戶設置虛擬CPU個數必須是整數,每個任務至少使用node2 的半個CPU(不能更少了)。
此外,Hadoop 2.0還引入了基於cgroups的輕量級資源隔離方案,這大大降低了同節點上任務間的相互干擾,而Hadoop 1.0僅采用了基於JVM的資源隔離,粒度非常粗糙。
盡管Hadoop 2.中的資源管理方案看似比較完美,但仍存在以下幾個問題:
(1) 資源總量仍是靜態配置的,不可以動態修改。這個已在完善中,具體可參考:
https://issues.apache.org/jira/browse/YARN-291
(2)CPU是通過引入的“虛擬CPU”設置的,而虛擬CPU的概念是模糊的,有歧義的,而社區正在嘗試借鑒amazon EC2中的ECU概念對其進行規整化,具體參考:
https://issues.apache.org/jira/browse/YARN-1024
https://issues.apache.org/jira/browse/YARN-972
(3)無法支持以組為單位的資源申請,比如申請一組符合某種要求的資源,目前社區也在添加,具體參考:
https://issues.apache.org/jira/browse/YARN-624
(4)調度語義不完善,比如目前應用程序只能申請的同一個節點上相同優先級的資源種類必須唯一,比如來自節點node1上優先級為3的資源大小是<1 vcore 2048 mb>,則不能再有自他大小,否則將會被覆蓋掉。目前社區正在完善,具體參考:
https://issues.apache.org/jira/browse/YARN-314
因此,在資源管理方面,Hadoop 2.0比1.0先進的多,它摒棄了基於slot的資源管理方案,采用了基於真實資源的管理方案,這將在資源利用率、資源控制、資源隔離等方面有明顯改善,隨着Hadoop 2.0調度語義的豐富和完善,它必將發揮越來越大的作用。
2. Yarn 框架原理及運行機制
2.1 Yarn 框架
(2) NodeManager:以下簡稱MM。YARN中的資源結點模塊,負責啟動管理container。
(3) ApplicationMaster:以下簡稱AM。YARN中每個應用都會啟動一個AM,負責向RM申請資源,請求NM啟動container,並告訴container做什么事情。
(4) Container:對任務運行環境的抽象。它描述一系列信息:任務運行資源(包括節點、內存、CPU)、任務啟動命令、任務運行環境
上圖中 ResourceManager 支持分層級的應用隊列,這些隊列享有集群一定比例的資源。從某種意義上講它就是一個純粹的調度器,它在執行過程中不對應用進行監控和狀態跟蹤。同樣,它也不能重啟因應用失敗或者硬件錯誤而運行失敗的任務。
每一個應用的 ApplicationMaster 的職責有:向調度器索要適當的資源容器,運行任務,跟蹤應用程序的狀態和監控它們的進程,處理任務的失敗原因。
2.2 Yarn 框架相對於老的 MapReduce 框架的優勢呢
2. 在新的 Yarn 中,ApplicationMaster 是一個可變更的部分,用戶可以對不同的編程模型寫自己的 AppMst,讓更多類型的編程模型能夠跑在 Hadoop 集群中,可以參考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
3. 對於資源的表示以內存為單位 ( 在目前版本的 Yarn 中,沒有考慮 cpu 的占用 ),比之前以剩余 slot 數目更合理。
4. 老的框架中,JobTracker 一個很大的負擔就是監控 job 下的 tasks 的運行狀況,現在,這個部分就扔給 ApplicationMaster 做了,而 ResourceManager 中有一個模塊叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是監測 ApplicationMaster 的運行狀況,如果出問題,會將其在其他機器上重啟。
5. Container 是 Yarn 為了將來作資源隔離而提出的一個框架。這一點應該借鑒了 Mesos 的工作,目前是一個框架,僅僅提供 java 虛擬機內存的隔離 ,hadoop 團隊的設計思路應該后續能支持更多的資源調度和控制 , 既然資源表示成內存量,那就沒有了之前的 map slot/reduce slot 分開造成集群資源閑置的尷尬情況。
2.3 以 Yarn 為基礎的 Hadoop 2.0 生態系統
