點擊上方藍色字體,選擇“設(shè)為星標”

本文作者:http://suo.im/5DcrnH
點擊右側(cè)關(guān)注,大數(shù)據(jù)開發(fā)領(lǐng)域最強公眾號!點擊右側(cè)關(guān)注,暴走大數(shù)據(jù)!
Linux CGroup 全稱是 Linux Control Group,是 Linux 內(nèi)核提供的一個用來限制進程資源使用的功能,支持如 CPU, 內(nèi)存,磁盤 IO 等資源的使用限制。用戶可以使用 CGroup 對單個進程或者一組進程進行精細化的資源限制,具體使用方式可以查看參考文檔。
目前, Yarn NodeManager 能夠使用 CGroup 來限制所有 containers 的資源使用,主要是 CPU 資源。如果不用 CGroup, 在 NM 端很難實現(xiàn)對 container 的 CPU 使用進行限制。默認狀態(tài)下, container 的 CPU 使用是沒有限制的,container 申請了 1 vcore ,實際上能夠使用所有的 CPU 資源。所以如果 NM 上分配了一個 vcore 申請較少實際上 CPU 使用極高的任務(wù),常常會導(dǎo)致節(jié)點上運行的所有的任務(wù)都延時。NM 運行時,可以通過 ContainersMonitor 線程監(jiān)控 container 內(nèi)存和 CPU 使用。對于 container 內(nèi)存使用, 一旦發(fā)現(xiàn)其超出申請內(nèi)存大小,就會立即發(fā)起 kill container 命令,回收 container 的資源。ContainersMonitor 雖然也支持 CPU 使用監(jiān)控,但是 CPU 資源不像內(nèi)存資源,其使用量的峰值是基本上可以確定的,在所有機器或者系統(tǒng)上都基本一致。CPU 受限于 CPU 硬件性能, 同一個任務(wù)在不同的機器上的 CPU 使用率可能差異巨大,所以不能發(fā)現(xiàn) container CPU 使用超過申請大小就 kill container 。同時,由于 container 都是由子進程的方式啟動的, NM 也是很難通過直接控制 container 運行和暫停來調(diào)整其 CPU 使用率。因此,在沒有 CGroup 功能的情況下, NM 是很難直接限制 container 的 CPU 使用的。所以接下來我們主要介紹 Yarn 如何啟用 CGroup 來限制 containers CPU 資源占用。啟用
NM 啟用 CGroup 功能主要需要在 yarn-site.xml 里設(shè)置以下配置:1. 啟用 LCE :
在 Nodemanager 中, CGroup 功能集成在 LinuxContainerExecutor 中,所以要使用 CGroup 功能,必須設(shè)置 container-executor 為 LinuxContainerExecutor. 同時需要配置 NM 的 Unix Group,這個是可執(zhí)行的二進制文件 container-executor 用來做安全驗證的,需要與 container-executor.cfg 里面配置的一致。詳細配置可參見 Yarn ContainerExecutor 配置與使用。 yarn.nodemanager.container-executor.class org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor yarn.nodemanager.linux-container-executor.group hadoop
2. 啟用 CGroup :
LinuxContainerExecutor 并不會強制開啟 CGroup 功能, 如果想要開啟 CGroup 功能,必須設(shè)置 resource-handler-class 為 CGroupsLCEResourceHandler. yarn.nodemanager.linux-container-executor.resources-handler.class org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler
3. 配置 Yarn CGroup 目錄:
NM 通過 yarn.nodemanager.linux-container-executor.cgroups.hierarchy 配置所有 Yarn Containers 進程放置的 CGroup 目錄。如果系統(tǒng)的 CGroup 未掛載和配置,可以在系統(tǒng)上手動掛載和配置和啟用 CGroup 功能,也可以通過設(shè)置 yarn.nodemanager.linux-container-executor.cgroups.mount 為 true,同時設(shè)置 CGroup 掛載路徑 yarn.nodemanager.linux-container-executor.cgroups.mount-path 來實現(xiàn) NM 自動掛載 CGroup (不建議這樣用,問題挺多)。如果系統(tǒng)的 CGroup 已經(jīng)掛載且配置完成,而且 Yarn 用戶有 CGroup cpu 子目錄的寫入權(quán)限,NM 會在 cpu 目錄下創(chuàng)建 hadoop-yarn 目錄 ,如果該目錄已經(jīng)存在,保證 yarn 用戶有寫入權(quán)限即可。 yarn.nodemanager.linux-container-executor.cgroups.hierarchy /hadoop-yarn yarn.nodemanager.linux-container-executor.cgroups.mount false yarn.nodemanager.linux-container-executor.cgroups.mount-path /sys/fs/cgroup
4. CPU 資源限制:
NM 主要使用兩個參數(shù)來限制 containers CPU 資源使用。首先,使用 yarn.nodemanager.resource.percentage-physical-cpu-limit 來設(shè)置所有 containers 的總的 CPU 使用率占用總的 CPU 資源的百分比。比如設(shè)置為 60,則所有的 containers 的 CPU 使用總和在任何情況下都不會超過機器總體 CPU 資源的 60 %。然后,使用 yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 設(shè)置是否對 container 的 CPU 使用進行嚴格限制。如果設(shè)置為 true ,即便 NM 的 CPU 資源比較空閑, containers CPU 使用率也不能超過限制,這種配置下,可以嚴格限制 CPU 使用,保證每個 container 只能使用自己分配到的 CPU 資源。但是如果設(shè)置為 false ,container 可以在 NM 有空閑 CPU 資源時,超額使用 CPU,這種模式下,可以保證 NM 總體 CPU 使用率比較高,提升集群的計算性能和吞吐量,所以建議使用非嚴格的限制方式(實際通過 CGroup 的 cpu share 功能實現(xiàn))。不論這個值怎么設(shè)置,所有 containers 總的 CPU 使用率都不會超過 cpu-limit 設(shè)置的值。NM 會按照機器總的 CPU num* limit-percent 來計算 NM 總體可用的實際 CPU 資源,然后根據(jù) NM 配置的 Vcore 數(shù)量來計算每個 Vcore 對應(yīng)的實際 CPU 資源,再乘以 container 申請的 Vcore 數(shù)量計算 container 的實際可用的 CPU 資源。這里需要注意的是,在計算總體可用的 CPU 核數(shù)時,NM 默認使用的實際的物理核數(shù),而一個物理核通常會對應(yīng)多個邏輯核(單核多線程),而且我們默認的 CPU 核數(shù)通常都是邏輯核,所以我們需要設(shè)置 yarn.nodemanager.resource.count-logical-processors-as-cores 為 true 來指定使用邏輯核來計算 CPU 資源。 yarn.nodemanager.resource.percentage-physical-cpu-limit 80 yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage false yarn.nodemanager.resource.count-logical-processors-as-cores true
注意事項
Linux 內(nèi)核版本 3.10.0-327.el7.x86_64 上 Yarn 啟用 CGroup 功能后,會觸發(fā)內(nèi)核 BUG,導(dǎo)致內(nèi)核卡死,重啟,NM 掛掉,所有運行的任務(wù)失敗。所以如果需要啟用 CGroup 功能,絕對不能使用 3.10.0-327.el7.x86_64 版本內(nèi)核。親測升級內(nèi)核版本可解決該問題。歡迎點贊+收藏+轉(zhuǎn)發(fā)朋友圈素質(zhì)三連文章不錯?點個【在看】吧!??