将 CGroups 与 YARN 配合使用

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。如果您希望使用 CGroups,则资源处理程序类必须设置为 CGroupsLCEResourceHandler。DefaultLCEResourcesHandler 将不起作用。
yarn.nodemanager.linux-container-executor.cgroups.hierarchy 放置 YARN 进程的 cgroups 层次结构(不能包含逗号)。如果 yarn.nodemanager.linux-container-executor.cgroups.mount 为 false(即,如果 cgroups 已预先配置),并且 YARN 用户对父目录具有写访问权限,则将创建该目录。如果该目录已存在,则管理员必须向 YARN 递归授予写权限。
yarn.nodemanager.linux-container-executor.cgroups.mount 如果未找到,LCE 是否应尝试挂载 cgroups - 可以为 true 或 false。
yarn.nodemanager.linux-container-executor.cgroups.mount-path 可选。CGroups 所在的位置。如果 yarn.nodemanager.linux-container-executor.cgroups.mount 为 true,LCE 将尝试在此处挂载它们。如果 yarn.nodemanager.linux-container-executor.cgroups.mount 为 false,LCE 将尝试使用此位置的 CGroups。如果指定了此路径及其子目录(CGroup 层次结构),则在启动 NodeManager 之前,YARN 必须存在这些路径并具有对其进行读写权限。有关详细信息,请参阅下面的 CGroups 挂载选项。
yarn.nodemanager.linux-container-executor.group NodeManager 的 Unix 组。它应与 “container-executor.cfg” 中的设置匹配。此配置是验证容器执行程序二进制文件的安全访问所必需的。

一旦启用 CGroups,以下与限制 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 使用量。这可确保容器只能使用分配给它们的 CPU。当设为 false 时,容器可以在有空闲 CPU 时使用空闲 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 之前挂载 cgroup。
已挂载或已链接但不在 /proc/mounts 中的 CGroups 如果可以通过 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 确实有一些要求。如果在非安全模式下运行,默认情况下,LCE 将以“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 运行作业的用户
(默认) (默认) nobody
yarn (默认) yarn
yarn false (提交作业的用户)