Hadoop 3.1.1

在 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-useryarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users运行作业的账户名
(default) (default) nobody
yarn (default) yarn
yarn false (User submitting the job)
原文地址:https://www.cnblogs.com/shishaochen/p/9655661.html