在 Yarn 上使用 CGroups
CGroups 是一種將任務及其子任務聚集和划分進一個垂直的分組的策略,並提供在此結構上的特別的操作。CGroups 是 Linux 內核功能,自內核版本 2.6.24 被引入。從 Yarn 角度,該功能使得限額容器的資源使用成為可能。一個示例是 CPU 使用,如果沒有 CGroups,限制容器的 CPU 使用非常困難。
CGroups 配置
本節描述 CGroups 相關的配置參數。
以下參數和啟動 CGroups 有關。請在 yarn-site.xml 中設定:
參數 | 描述 |
---|---|
yarn.nodemanager.container-executor.class | 請設置為 org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor。CGroups 是 Linux 內核功能並通過 LinuxContainerExecutor 暴露出來。 |
yarn.nodemanager.linux-container-executor.resources-handler.class | 請設置為 org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler。啟用 LinuxContainerExecutor 並不強制使用 CGroups。如果你想使用,resource-handler-class 必須設置為 CGroupsLCEResourceHandler。 |
yarn.nodemanager.linux-container-executor.cgroups.hierarchy | 放置 Yarn 進程的 CGroups 目錄(不能有逗號)。如果 yarn.nodemanager.linux-container-executor.cgroups.mount 為 false(即必須預先配置 CGroups),且 Yarn 用戶對父目錄由寫權限,那么這個目錄將被創建。如果已經存在,管理員必須沿着 CGroups 目錄遞歸地授予 Yarn 寫權限。 |
yarn.nodemanager.linux-container-executor.cgroups.mount | 如果沒有發現,LinuxContainerExecutor 是否嘗試掛載 CGroups。取值是 true 或 false。 |
yarn.nodemanager.linux-container-executor.cgroups.mount-path | 可選參數,指明 CGroups 的目錄。如果 yarn.nodemanager.linux-container-executor.cgroups.mount 為 true,LinuxContainerExecutor 將嘗試掛載資源到這里;否則,LinuxContainerExecutor 會使用該目錄的 CGroups。如果該參數被配置,那么在 NodeManager 啟動前,給定的目錄及其子目錄(CGroups 垂直結構)必須存在,並且 Yarn 是有權讀寫的。更多細節請參閱 Cgroups 掛載選項。 |
yarn.nodemanager.linux-container-executor.group | NodeManager 的 Unix 用戶組,須與 container-executor.cfg 的設置保持一致。該參數對於驗證容器執行程序的安全訪問是必需的。 |
以下參數和 Yarn 容器的資源限額有關:
參數 | 描述 |
---|---|
yarn.nodemanager.resource.percentage-physical-cpu-limit | 該參數限額了所有 Yarn 容器的 CPU 使用。它對容器累計的 CPU 使用設定了硬性的上界。舉例來說,如果值為 60,那么所有 Yarn 容器的 CPU 使用率不會超過 60%。 |
yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage | CGroups 支持硬性或軟性的 CPU 限額。如果該參數為 true,即使 CPU 仍然有富余,容器也無法使用更多的 CPU 資源,這確保了容器只能使用分配的資源量。如果該參數為 false,容器將可以使用空閑的 CPU 資源。需要注意的是,無論該參數是 true 還是 false,所有容器總的 CPU 使用率依然不能超過 yarn.nodemanager.resource.percentage-physical-cpu-limit 定義的值。 |
CGroups 掛載選項
Yarn 通過一個由內核掛載進文件系統的目錄使用 CGroups。以下是附加到 CGroups 的選項。
選項 | 描述 |
---|---|
已經發現掛載的 CGroups | 應該在更新的操作系統(如 RHEL7 和 Ubuntu16) 或者管理員在 Yarn 啟動前已經掛載了 CGroups的情況下,啟用該選項。設定 yarn.nodemanager.linux-container-executor.cgroups.mount 為 false 且其他參數采用默認值,Yarn 將會在在 /proc/mounts 目錄下尋找掛載點。常見的路徑包括 /sys/fs/cgroup 和 /cgroup。不同 Linux 發行版本的默認路徑可能大不相同。 |
由 Yarn 掛載 CGroups | 警告:該選項因為安全原因已經被淘汰。默認情況下,container-executor.cfg 文件中設定了 feature.mount-cgroup.enabled=0。請在啟動 Yarn 前掛載 CGroups。 |
CGroups 已經掛載或者鏈接了但不在路徑 /proc/mounts 下 | 如果可以通過 lxcfs (或者由其他文件系統模擬出)訪問 Cgroups,請將 yarn.nodemanager.linux-container-executor.cgroups.mount-path 指向你的 CGroups 根目錄,並設定 yarn.nodemanager.linux-container-executor.cgroups.mount 為 false,Yarn 在發現其他 CGroup 掛載點前,將首先使用該路徑。該路徑下對於每一個 CGroup 都存在一個子目錄,名稱由 CGroup 子系統用逗號分隔,如 <path>/cpu,cpuacct。有效的子系統名稱由 cpu、cpuacct、cpuset、memory、net_cls、blkio、freezer和devices。 |
CGroups 和安全
CGroups 本身並沒有和安全相關的配置,但 LinuxContainerExecutor 有需求。如果運行在非安全模式下(默認),LinuxContainerExecutor 會用 nobody 賬戶運行所有的作業。可以設定 yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user 到期望的用戶名。除此之外,也可以配置為提交作業的用戶名,相應地要設置 yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users 為 false。
yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user | yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users | 運行作業的賬戶名 |
---|---|---|
(default) | (default) | nobody |
yarn | (default) | yarn |
yarn | false | (User submitting the job) |