編者按:Hadoop YARN同時支持內存和CPU兩種資源的調度,在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調度器負責資源的分配,而NodeManager則負責資源的供給和隔離。本文董西城將會介紹YARN在資源隔離方面的一些進展。
作者原文:
資源調度和資源隔離是YARN作為一個資源管理系統,最重要和最基礎的兩個功能。資源調度由ResourceManager完成,而資源隔離由各個NodeManager實現,在文章“Hadoop YARN中內存和CPU兩種資源的調度和隔離”中,我已經介紹了YARN的內存和CPU的資源隔離,本文將介紹YARN在資源隔離方面的一些進展。
當談及到資源時,我們通常指內存,CPU和IO三種資源。默認情況下,YARN不會對任何資源進行隔離,當然,如果采用Java語言編寫的程序,則會使用JVM內置的隔離機制為內存資源進行隔離。隨著YARN的逐步完善,在內存,CPU和IO三種資源隔離方面均有重大進展。
首先介紹內存資源隔離。內存資源是YARN從一開始就會管理和調度的資源,考慮到內存資源的特殊性,YARN并沒有顯式地對內存資源進行強制隔離,以免在產生內存抖動時,任務被不優雅地殺掉。當然,如果你采用了Java語言編寫了任務,則可以使用JVM提供的內存隔離機制,這是一種不錯的選擇。對于YARN而言,目前所做的工作是監控每個任務的進程樹,如果每個任務的進程樹使用的總物理內存或者總虛擬內存量超過了預先設置值,則依次發送TERM和KILL兩個信號將整個進程樹殺死。如果你在YARN上運行了一些特殊的任務或者服務,希望使用Cgroups對內存進行嚴格的隔離,可以關注:https://issues.apache.org/jira/browse/YARN-1856
接下來介紹CPU資源隔離。CPU資源調度從Hadoop 2.2.0開始已經得到了完好的支持,但CPU資源隔離支持的很不好,目前已經完成或者正在做的工作如下;
(1)CPU資源按照百分比進行使用和隔離。通過Cgroup的cpu.shares參數實現的,這種方式能夠保證每個節點上的cpu資源得到充分的共享和使用,從而產生較高的CPU利用率。從hadoop 2.2.0開始已經得到了支持,但是要啟用這個功能,還需經過較為復雜的參數配置和調整,相關jira為:https://issues.apache.org/jira/browse/YARN-3
(2)限制每個container的CPU資源使用上限。上一一種CPU隔離方式能夠保證每個Contaienr的CPU使用下限,大部分情況下,可能拿到比自己期望的多的CPU資源;而這種隔離則不同,它會嚴格限制cpu使用上限,比如你希望使用2個CPU,則會限制你只能使用2個,不能多用,即使同機器上仍有大量空閑CPU資源,也不會允許你使用。該功能是通過Cgroup的cpu.cfs_quota_us和cpu.cfs_period_us兩個參數實現的,目前已經有可使用的patch,但尚未merge到主干中,具體參考:https://issues.apache.org/jira/browse/YARN-810
(3)限制yarn使用的CPU上限。實現機制與(2)相同,已有可使用的patch,具體參考:https://issues.apache.org/jira/browse/YARN-2440
需要注意的是,YARN允許你配置每個節點上可使用的物理cpu個數,以及物理cpu與虛擬cpu個比例,而用戶申請資源時,只能申請虛擬cpu。默認情況下,物理cpu和虛擬cpu是1:1的,如果你的集群是異構的,某些節點上的CPU擁有更強的計算能力,則可以調整物理cpu和虛擬cpu的比例。虛擬cpu的概念是借鑒“物理內存和虛擬內存”的,主要目的是消除集群中cpu計算能力的異構性。
最后介紹IO資源。IO資源分為磁盤IO和網絡IO兩種。目前YARN已經在這兩方面展開工作,初步的設計文檔已經發布。IO資源的隔離比CPU和內存復雜的多,為了便于用戶量化IO資源,YARN仿照“虛擬cpu”的概念,引入了“虛擬磁盤”(vdisk),第一階段將嘗試使用cgroup的blkio模塊實現磁盤IO隔離。當然,在實現該功能之前,還需要將IO資源加入調度器管理的范疇,使得hadoop中的資源調度器,比如公平調度器或者容量調度器,可以對磁盤IO和網絡IO進行調度。
原文鏈接:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-resource-isolation/