这是CDP中Yarn使用手册系列的一篇。之前的文章请参考《Apache Hadoop Yarn概述》、《CDP中使用YARN Web UI和CLI》、《CDP中配置Apache Hadoop Yarn的安全性》。
您可以通过调度分配资源、通过配置 cgroup 限制 CPU 使用、使用分区将集群划分为子集群以及在 Docker 容器上启动应用程序来管理集群上运行的应用程序的资源。
该CapacityScheduler负责调度。所述CapacityScheduler用于在操作员友好的方式运行的应用程序的Hadoop作为共享,多租户簇同时最大化吞吐量和集群的利用率。
该ResourceCalculator是yarn的部分CapacityScheduler。如果您只有一种类型的资源,通常是 CPU 虚拟核心 (vcore),请使用 DefaultResourceCalculator
. 如果您有多种资源类型,请使用 DominantResourceCalculator
.
1 多种资源类型的YARN资源分配
您可以使用 YARN 中的容量调度程序来管理集群容量。您可以使用容量调度程序的DefaultResourceCalculator
或 DominantResourceCalculator
来分配可用资源。
YARN 中调度的基本单位是队列。每个队列的容量指定了可用于提交到队列的应用程序的集群资源的百分比。您可以在反映使用集群资源的组织、组和个人所需的数据库结构、资源要求和访问限制的层次结构中设置队列。
当您希望资源计算器仅考虑用于资源计算的可用内存时,您可以使用默认资源计算器。使用默认资源计算器 ( DefaultResourceCalculator
) 时,将根据可用内存分配资源。
如果您有多种资源类型,请使用主导资源计算器 ( DominantResourceCalculator
) 来启用 CPU、GPU 和内存调度。主导资源计算器基于资源分配的主导资源公平 (DRF) 模型。DRF 旨在在混合工作负载集群中在不同类型的进程之间公平地分配 CPU 和内存资源。
例如,如果用户 A 运行 CPU 密集型任务,用户 B 运行内存密集型任务,则 DRF 为用户 A 运行的任务分配更多 CPU 和更少内存,为用户 B 运行的任务分配更少 CPU 和更多内存. 在单个资源情况下,所有作业都请求相同的资源,DRF 会降低该资源的最大-最小公平性。
2 分层队列特征
在设置容量调度程序分层队列之前,您必须考虑它们的各种特征。
有两种类型的队列:父队列和叶队列。
· 父队列支持跨组织和子组织的资源管理。它们可以包含更多的父队列或叶队列。他们自己不直接接受任何申请提交。
· 叶队列是位于父队列下并接受应用程序的队列。叶队列没有任何子队列,因此没有任何以“.queues”结尾的配置属性。
· 有一个不属于任何组织的顶级父根队列,而是代表集群本身。
· 使用父队列和叶队列,管理员可以为各种组织和子组织指定容量分配。
3 队列之间的调度
分层队列确保在任何剩余的空闲资源与属于其他组织的队列共享之前,首先在组织的子队列之间共享有保证的资源。这使每个组织都能够控制其保证资源的使用。
· 在层次结构中的每个级别,每个父队列都根据需要以排序的方式保存其子队列的列表。队列的排序由当前使用的每个队列容量的部分决定(如果任意两个队列的保留容量相等,则由全路径队列名称决定)。
· 根队列了解集群容量需要如何在第一级父队列之间分配,并对其每个子队列调用调度。
· 每个父队列将其容量限制应用于其所有子队列。
· 叶队列保存活动应用程序列表(可能来自多个用户)并以 FIFO(先进先出)方式调度资源,同时遵守为单个用户指定的容量限制。
4 申请预留
对于资源密集型应用程序,如果节点的可用容量可以满足特定应用程序的要求,则容量调度程序会在集群节点上创建预留。这确保资源仅由该特定应用程序使用,直到满足应用程序预留。
容量调度器负责将集群中的空闲资源与应用程序的资源需求进行匹配。很多时候,一个调度周期会发生,即使节点上有空闲资源,它们的大小也不足以满足应用程序在队列头部等待资源的需求。这通常发生在高内存应用程序中,这些应用程序对容器的资源需求远大于集群中运行的典型应用程序。这种不匹配会导致这些资源密集型应用程序匮乏。
容量调度程序预留功能解决了这个问题,如下所示:
· 当一个节点报告一个完成的容器时,容量调度器会根据容量和最大容量设置选择一个合适的队列来利用新的可用资源。
· 在选定的队列中,容量调度程序按照 FIFO 顺序查看应用程序以及用户限制。一旦发现有需要的应用程序,容量调度器就会尝试查看该节点的可用容量是否可以满足该应用程序的要求。
· 如果大小不匹配,Capacity Scheduler 会立即在节点上为应用程序所需的 Container 创建预留。
· 一旦为节点上的应用程序预留了资源,容量调度器就不会将这些资源用于任何其他队列、应用程序或容器,直到应用程序预留完成。
· 进行预留的节点在足够多的 Container 完成运行时进行报告,以便节点上的总可用容量现在与预留大小匹配。发生这种情况时,容量调度程序将预留标记为已完成,将其删除,并在节点上分配一个容器。
· 在某些情况下,另一个节点会满足应用程序所需的资源,因此应用程序不再需要第一个节点上的预留容量。在这种情况下,预留将被简单地取消。
为了防止预留数量以无限方式增长,并避免任何潜在的调度死锁,容量调度器在每个节点上一次仅维护一个活动预留。
5 资源分发工作流
在调度期间,层次结构中任何级别的队列都按照其当前使用容量的顺序进行排序,可用资源从当前服务不足的队列开始分配。
仅就性能而言,资源调度具有以下工作流程:
· 队列服务不足的情况越多,它在资源分配期间获得的优先级就越高。服务不足的队列是已用容量与集群总容量之比最小的队列。
o 任何父队列的已用容量被定义为其所有后代队列的已用容量的总和,递归地。
o 叶队列的已用容量是该队列中运行的所有应用程序的分配容器所使用的资源量。
· 一旦决定为父队列提供当前可用的空闲资源,就会递归地进行进一步的调度,以确定哪个子队列可以使用这些资源——基于先前描述的已用容量概念。
· 进一步的调度发生在每个叶队列内,以按 FIFO 顺序将资源分配给应用程序。
o 这还取决于位置、用户级别限制和应用程序限制。
o 一旦选择了叶队列中的应用程序,调度也发生在应用程序中。应用程序可能具有不同的资源请求优先级。
· 为确保弹性,已配置但由于缺乏需求而未被任何队列使用的容量会自动分配给需要资源的队列。
5.1 相对模式下的资源分配过程 - 示例
要了解资源分配工作流,请考虑一个 100 节点集群的示例,每个集群为 YARN 容器分配 10 GB 内存,集群总容量为 1000 GB (1 TB)。
例如,在相对分配模式下,“工程”组织分配了集群容量的 60%,即绝对容量 600 GB。同样,“支持”组织分配 100 GB,“营销”组织分配 300 GB。
在“工程”组织下,容量在“开发”团队和“qa”团队之间以1:4的比例分配。所以“开发”得到120GB,480GB分配给“qa”。
现在考虑以下事件的时间线:
· 最初,整个“工程”队列是空闲的,没有运行任何应用程序,而“支持”和“营销”队列则充分利用了它们的容量。
· 用户 Sid 和 Hitesh 首先向“开发”叶队列提交应用程序。它们的应用程序具有弹性,可以使用集群中的所有可用资源或集群资源的子集(取决于资源使用状态)运行。
o 即使“开发”队列分配了 120 GB,Sid 和 Hitesh 也被允许各自占用 120 GB,总共 240 GB。
o 尽管“开发”队列配置为以 120 GB 的容量运行,但仍可能发生这种情况。容量调度器允许集群资源的弹性共享,以更好地利用可用的集群资源。由于“工程”队列中没有其他用户,因此允许 Sid 和 Hitesh 使用可用的空闲资源。
· 接下来,用户Jian、Zhijie 和Xuan 向“开发”叶子队列提交了更多应用程序。即使每个限制为 120 GB,队列中的总使用容量也变为 600 GB —— 实质上接管了分配给“qa”叶队列的所有资源。
· 用户 Gupta 现在向“qa”队列提交申请。由于集群中没有可用资源,用户的应用程序必须等待。
o 鉴于“开发”队列正在使用所有可用的集群资源,Gupta 可能会也可能不会立即取回他的“qa”队列的保证容量——这取决于是否启用了抢占。
· 随着Sid、Hitesh、Jian、Zhijie、Xuan 的应用程序运行完毕,资源可用,新的可用Container 将分配给Gupta 的应用程序。
这将一直持续到集群稳定在“开发”和“qa”队列的预期 1:4 资源使用率。
从这个例子可以看出,滥用用户有可能不断提交应用程序,从而锁定其他队列的资源分配,直到容器完成运行或被抢占。为了避免这种情况,Capacity Scheduler 支持限制任何队列的弹性增长。例如,您可以通过设置最大容量属性来限制“开发”队列独占“工程”队列容量。
根据本示例设置最大容量属性,请执行以下操作:
1. 在 Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击开发队列上的三个垂直点,然后选择Edit Child Queues选项。
3. 在配置值字段中输入40。
4. 点击保存。
设置后,“开发”队列的用户仍然可以超出其 120 GB 的容量,但不会为他们分配超过“工程”父队列容量的 40%(即 600 GB 的 40%) = 240 GB)。
容量和最大容量属性可用于控制使用 YARN 集群的组织和子组织之间的共享和弹性。管理员应该平衡这些属性以避免导致利用率损失的严格限制,并避免过度的跨组织共享。
6 资源分配概览
您可以使用 Absolute 模式(其中分配 vCore 和内存资源的实际单位)、Relative 模式(其中资源按总资源的百分比分配)或权重模式(其中分配资源)为队列分配资源。资源作为总资源的一部分进行分配。
· 相对模式:在 YARN 队列管理器 UI 中,容量值显示为百分比。编辑队列资源时,容量以百分比指定。分配给一组兄弟队列的容量必须等于父队列的 100%。
· 绝对模式:在 YARN 队列管理器 UI 中,容量值以单位显示。编辑队列资源时,会为每种资源类型显示一个单独的选项卡。分配的总容量必须小于或等于父级的容量。
· 权重模式:在 YARN 队列管理器 UI 中,容量值显示为数值并以“w”为后缀。例如,5w。编辑队列资源时,容量以总资源的权重或分数指定。根据队列的权重与父项下配置的权重总和的关系来划分资源。
注意
如果您有处于相对模式的现有受管队列,则不允许转换为权重模式。您必须删除受管父队列,然后从相对模式转换为权重模式。
注意
YARN 队列管理器不支持资源的混合分配。也就是说,一些队列使用百分比分配,一些队列使用权重。
7 使用 CPU 调度
具有 CPU 调度功能的 Cgroup 可帮助您有效管理混合工作负载。
注意
您应该只在 Linux 环境中使用 CPU 调度,因为 Windows 没有隔离机制(cgroups 等效)。
仅限 MapReduce 作业
如果您主要在集群上运行 MapReduce 作业,则启用 CPU 调度不会对性能产生太大影响。MapReduce 的主要资源是内存,因此 DRF 调度程序继续以类似于默认资源计算器的方式平衡 MapReduce 作业。在单个资源的情况下,DRF 减少到该资源的最大-最小公平性。
混合工作负载
混合工作负载的一个例子是在 YARN 上运行 MapReduce 和 Storm 的集群。MapReduce 不受 CPU 限制,但 Storm on YARN 的容器需要比内存更多的 CPU。当您将 Storm 作业与 MapReduce 作业一起添加时,DRF 调度程序会尝试平衡内存和 CPU 资源,但您可能会看到一些性能下降的结果。随着您添加更多 CPU 密集型的 Storm 作业,随着集群 CPU 资源的消耗,单个作业的运行时间开始延长。
为了解决这个问题,您可以将 cgroups 与 CPU 调度一起使用。使用 cgroups 可为 CPU 密集型进程(例如 YARN 上的 Storm)提供隔离,从而使您能够以可预测的方式规划和约束 CPU 密集型 Storm 容器。
您还可以将分区与 CPU 调度和 cgroup 结合使用,以将Storm on YARN 作业限制为集群节点的子集。
7.1 配置 CPU 调度和隔离
您可以在集群上配置 CPU 调度,为应用程序容器分配具有所需 CPU 资源的最佳节点。
1. 在Cloudera Manager 中,选择YARN服务。
2. 单击配置选项卡。
3. 搜索资源计算器类。
4. 选择 org.apache.hadoop.yarn.util.resource.DominantResourceCalculator 选项。
5. 搜索yarn.nodemanager.resource.cpu-vcores并通过提供物理内核数来设置vcores的数量以匹配 NodeManager 主机上的物理 CPU 内核数。
7.2 使用分布式 shell 进行 CPU 调度
您可以通过指定内存和 vCore 以外的资源来运行分布式 shell。以下是分布式 shell 的示例,但您也可以将 CPU 调度与其他框架一起使用。
使用以下命令为两个容器分配两个内核:
///
yarn jar </opt/cloudera/parcels/<CDH-version>/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar> \ -jar </opt/cloudera/parcels/<CDH-version>/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar> \ -shell_command "sleep 120" \ -container_resources memory-mb=3072,vcores=2 \ -num_containers 2
8 使用 GPU 调度
在您的集群上,您可以配置 GPU 调度和隔离。目前,YARN 仅支持 Nvidia GPU。您可以使用 Cloudera Manager 在集群上配置 GPU 调度。
8.1 配置 GPU 调度和隔离
您可以在集群上配置 GPU 调度和隔离。目前,YARN 仅支持 Nvidia GPU。
· YARN NodeManager 必须与 Nvidia 驱动程序一起安装。
1. 在Cloudera Manager 中,导航到Hosts > Hosts Configuration。
2. 搜索cgroup。
3. 选中启用基于Cgroup 的资源管理 复选框。
4. 单击保存更改。
5. 导航到YARN >配置
6. 搜索cgroup。
7. 找到Use CGroups for Resource Management属性并为适用的集群启用它。
8. 找到始终使用Linux Container Executor属性并为适用的集群启用它。
9. 搜索gpu。
10.找到Enable GPU Usage属性并选中 NodeManager Default Group复选框。
11.找到NodeManager GPU Devices Allowed属性并使用以下方式之一定义由YARN 管理的GPU 设备。
o 使用默认值auto
将
自动检测所有 GPU 设备。在这种情况下,所有 GPU 设备都由 YARN 管理。
o 手动定义由 YARN 管理的 GPU 设备。
12.找到NodeManager GPU Detection Executable属性并定义nvidia-smi 的位置。默认情况下,此属性没有值,这意味着YARN 检查以下路径以查找nvidia-smi:
o /usr/bin
o /bin
o /usr/local/nvidia/bin
13.单击保存更改。
14.单击页面顶部的陈旧配置:需要重新启动按钮。
15.单击重新启动陈旧服务。
请注意,此步骤将重新启动所有具有陈旧配置的服务。
16.选择重新部署客户端配置,然后单击 立即重新启动。
如果NodeManager启动失败,会显示如下错误:
INFO gpu.GpuDiscoverer (GpuDiscoverer.java:initialize(240)) - Trying to discover GPU information ... WARN gpu.GpuDiscoverer (GpuDiscoverer.java:initialize(247)) - Failed to discover GPU information from system, exception message:ExitCodeException exitCode=12: continue...
通过LD_LIBRARY_PATH
使用以下命令在 yarn -env.sh 中导出来修复错误:export LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:$LD_LIBRARY_PATH
8.2 将 GPU 调度与分布式 shell 结合使用
您可以通过指定内存和 vCore 以外的资源来运行分布式 shell。以下是分布式 shell 的示例,但您也可以将 GPU 调度与其他框架一起使用。
使用以下命令在没有Docker 容器的情况下运行分布式 shell 和 GPU :
/
yarn jar </opt/cloudera/parcels/<CDH-version>/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar> \ -jar </opt/cloudera/parcels/<CDH-version>/lib/hadoop-yarn/hadoop-yarn-applications-distributedshell.jar> \ -shell_command /usr/local/nvidia/bin/nvidia-smi \ -container_resources memory-mb=3072,vcores=1,yarn.io/gpu=2 \ -num_containers 2
您会收到类似于以下内容的输出:
//
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 375.66 Driver Version: 375.66 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla P100-PCIE... Off | 0000:04:00.0 Off | 0 | | N/A 30C P0 24W / 250W | 0MiB / 12193MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla P100-PCIE... Off | 0000:82:00.0 Off | 0 | | N/A 34C P0 25W / 250W | 0MiB / 12193MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
9 使用FPGA调度
您可以使用 FPGA 作为资源类型。
现场可编程门阵列 (FPGA) 是一种包含可配置逻辑块矩阵(主要是逻辑门)的卡。FPGA 可以重新编程,这意味着可以重新布线门和集成设备之间的互连。这与普通 CPU 形成对比,因为 CPU 内部的布线和连接无法更改:只能更改其上运行的软件,但硬件始终相同。另一方面,FPGA 允许在电路级别上进行更改。
FPGA 设备不仅包含可重新布线的逻辑门(如 AND 或 OR 门),还包含存储器、DSP、芯片、外部连接器等。
9.1 FPGA 编程
FPGA 可以通过多种方式进行编程。最流行的方法是 VHDL 和 Verilog。
英特尔 FPGA 卡允许用户上传所谓的 OpenCL 内核以同时快速执行某些计算。OpenCL 是一个框架和一组标准,目前由 Khronos Group 开发和维护。有关更多信息,请参阅Khronos的 OpenCL 文档。
9.2 配置FPGA调度和隔离
您可以使用 Cloudera Manager 将 FPGA 启用和配置为资源类型。
确保 FPGA 运行时或 SDK 的安装方式使得节点管理器可以执行 aocl 命令。有关如何安装 FPGA 的更多信息,请参阅Intel Acceleration Stack Quick Start Guide for Intel Programmable Acceleration Card with Intel Arria 10 GX FPGA。
1. 在Cloudera Manager 中,选择YARN服务。
2. 单击配置选项卡。
3. 在过滤器下选择FPGA管理类别。
4. 找到Enable FPGA Usage属性并选择可以向请求它们的YARN 应用程序提供FPGA 设备的NodeManager。
5. 使用FPGA (aocl) 工具属性的路径指定安装在适用节点上的英特尔aocl 工具的完整本地路径。
6. 使用Allowed FPGA devices指定可以由YARN NodeManager 管理的FPGA 设备。
有效值如下:
o Auto
:默认值。允许使用所有可用的 FPGA 设备。
o 逗号分隔列表:列出允许的 FPGA 的次要编号。例如:0,1
7. 使用可用FPGA 设备列表属性手动指定可用的FPGA 设备。
按以下格式提供值: deviceA/major_number:minor_number,deviceB/major_number:minor_number
例如: acl0/238:0,acl1/238:1
使用该aocl diagnose
命令显示 acl 编号。
主要和次要设备号通常可以通过列出/dev
. 每张卡都有一个对应的设备文件。该ls -l
命令显示两个数字。
8. 使用FPGA设备主设备号属性提供FPGA 卡的主设备号。
此属性在container-executor.cfg
文件中使用。
重要
每个节点只能指定一个主编号,即一个节点只能有一种FPGA卡。
9. 使用FPGA初始化脚本属性来提供设置FPGA 设备环境的shell 脚本的路径。
初始化脚本设置各种环境变量,并提供其他脚本以允许aocl
工具正常运行。此脚本的内容在很大程度上取决于安装。例如,在英特尔处理加速卡 (PAC) 的情况下,有必要提供 init_env.sh
和init_opencl.sh
.
可能需要导出以下环境变量:
o AOCL_BOARD_PACKAGE_ROOT
o CL_CONTEXT_COMPILER_MODE_INTELFPGA
有关更多详细信息,请查阅供应商的文档。
10.单击保存更改。
11.重新启动受影响的NodeManager。
启用并配置了 FPGA 支持。通过指定yarn.io/fpga
为资源来请求 FPGA资源。
9.3 将 FPGA 与分布式 shell 结合使用
启用 FPGA 支持后,可以通过指定yarn.io/fpga
为资源来请求 FPGA 资源。
以下是分布式 shell 示例:
yarn jar /path/to/hadoop-yarn-applications-distributedshell.jar -jar /path/to/hadoop-yarn-applications-distributedshell.jar -shell_command "date" -container_resources memory-mb=2048,vcores=1,yarn.io/fpga=1 -num_containers 1
此命令在安装了 FPGA 卡的节点上运行该命令date
。
10 使用 Cgroups 限制 CPU 使用率
您可以使用 cgroups 来限制 Hadoop 集群中的 CPU 使用率。
您可以使用 cgroups 来隔离 Hadoop 集群中占用大量 CPU 的进程。如果您正在使用 CPU 调度,您还应该使用 cgroups 来约束和管理 CPU 进程。如果您不使用 CPU 调度,请不要启用 cgroup。
当您启用 CPU 调度时,队列仍用于分配集群资源,但使用利用显性资源公平性 (DRF) 的调度程序同时考虑 CPU 和内存。在 DRF 模型中,资源分配考虑了进程所需的主导资源。CPU 密集型进程(例如 Storm-on-YARN)获得更多的 CPU 和更少的内存。内存密集型进程(例如 MapReduce)获得更多内存和更少 CPU。DRF 调度程序旨在在混合工作负载集群中的不同类型的进程之间公平地分配内存和 CPU 资源。
Cgroups 通过提供 CPU 资源隔离来补充 CPU 调度。它使您能够对授予单个 YARN 容器的 CPU 资源量设置限制,还允许您对 YARN 进程使用的 CPU 资源总量设置限制。
Cgroups 代表了YARN 资源管理功能的一个方面,包括 CPU 调度、分区、存档存储和作为存储的内存。如果使用 CPU 调度,则应使用 cgroups 来约束和管理 CPU 进程。
10.1 使用 Cgroup
您可以使用严格的 cgroups CPU 限制来限制混合工作负载集群中的 CPU 进程。
混合工作负载的一个示例是运行 MapReduce 和 Storm-on-YARN 的集群。MapReduce 不受 CPU 限制(MapReduce 容器不需要太多 CPU)。Storm-on-YARN 受 CPU 限制:其容器要求的CPU 多于内存。当您开始将 Storm 作业与 MapReduce 作业一起添加时,DRF 调度程序会尝试平衡内存和 CPU 资源,但是随着更多 CPU 密集型 Storm 作业的添加,它们可能会开始占用大部分集群 CPU 资源。
您可以将 cgroup 与 CPU 调度一起使用来帮助管理混合工作负载。cgroups 为诸如 Storm-on-YARN 之类的 CPU 密集型进程提供隔离,从而使您能够以可预测的方式规划和约束 CPU 密集型 Storm 容器。
当您启用严格的 cgroup CPU 限制时,即使有额外的 CPU 可用,每个资源也只会获得它所要求的资源。这对于涉及退款或严格 SLA 实施的场景很有用,在这些场景中,您始终需要准确了解正在使用的百分比或 CPU。
此外,启用严格的 CPU 限制将使作业性能可预测,而如果不设置严格的限制,CPU 密集型作业在集群使用率不高时会运行得更快,但在集群中运行更多作业时会变慢。因此,严格的 CPU 限制对于基准测试也很有用。
您还可以将分区与 cgroups 和 CPU 调度结合使用,以将 Storm-on-YARN 作业限制为集群节点的子集。
如果您正在使用 cgroups 并想了解更多关于 CPU 性能的信息,您可以查看/cgroup/cpu/yarn/cpu.stat文件中的可用统计信息 。
10.2 启用 Cgroup
您可以启用 CPU 调度来启用 cgroup。您必须在ResourceManager 和 NodeManager 主机上的yarn-site.xml
配置某些属性才能启用 cgroup。
cgroups 是 Linux 内核功能。以下 Linux 操作系统支持 cgroups:
· CentOS 6.9、7.3
· RHEL 6.9、7.3
· SUSE 12
· Ubuntu 16
目前还没有适用于 Windows 的 cgroups。默认情况下,CDP 上未启用 cgroup。cgroups 要求 CDP 集群启用 Kerberos。
重要
该yarn.nodemanager.linux-container-executor.cgroups.mount
属性必须设置为false
。当前不支持将此值设置为true
。
启用 cgroup
必须在每次重新启动NodeManager 主机时运行以下命令以设置 cgroup 层次结构。请注意,操作系统对 cgroup 接口使用不同的挂载点。替换 /sys/fs/cgroup
为您的等效操作系统。
//
mkdir -p /sys/fs/cgroup/cpu/yarn chown -R yarn /sys/fs/cgroup/cpu/yarn mkdir -p /sys/fs/cgroup/memory/yarn chown -R yarn /sys/fs/cgroup/memory/yarn mkdir -p /sys/fs/cgroup/blkio/yarn chown -R yarn /sys/fs/cgroup/blkio/yarn mkdir -p /sys/fs/cgroup/net_cls/yarn chown -R yarn /sys/fs/cgroup/net_cls/yarn mkdir -p /sys/fs/cgroup/devices/yarn chown -R yarn /sys/fs/cgroup/devices/yarn
1. 在Cloudera Manager 中,选择YARN服务。
2. 单击配置选项卡。
3. 搜索Always Use Linux Container Executor并选择YARN-1(服务范围)选项。
4. NodeManager Advanced Configuration在Yarn-site.xml字段的NodeManager 高级配置片段(安全阀)中搜索并设置以下属性。
名称:yarn.nodemanager.linux-container-executor.group
值:Hadoop
5. 在Use CGroups for Resource Management字段中搜索CGroups并选择YARN-1 (Service-Wide)选项。
6. 搜索CGroups Hierarchy并将NodeManager 默认组值设置为/hadoop-yarn。
7. NodeManager Advanced Configuration在Yarn-site.xml字段的NodeManager 高级配置片段(安全阀)中搜索并设置以下属性。
名称:yarn.nodemanager.linux-container-executor.cgroups.mount
值:false
名称:yarn.nodemanager.linux-container-executor.cgroups.mount-path
值:/sys/fs/cgroup
8. (可选)设置YARN 使用的CPU 百分比。Containers CPU Limit在Containers CPU Limit Percentage字段中搜索 并设置值 。
设置可以分配给 YARN 容器的 CPU 百分比。在大多数情况下,应使用默认值 100%。如果您有另一个进程需要在也需要 CPU 资源的节点上运行,您可以降低分配给 YARN 的 CPU 百分比以释放其他进程的资源。
9. (可选)设置灵活或严格的CPU 限制。搜索Strict CGroup Resource Usage并选择 NodeManager Default Group字段。
CPU 作业受限于 CPU 调度和启用 cgroups,但默认情况下这些是灵活的限制。如果有空闲 CPU 周期可用,则允许容器超出为其设置的 CPU 限制。通过灵活的限制,可供容器使用的 CPU 资源量可以根据集群使用情况而有所不同——集群中在任何给定时间可用的 CPU 数量。
您可以使用 cgroups 对 CPU 使用率设置严格的限制。启用严格限制后,每个进程仅接收其请求的 CPU 资源量。在严格限制下,CPU 进程每次运行时都会收到相同数量的集群资源。
默认情况下不启用严格限制(设置为 false)。
注意
不管这个属性是真还是假,总的容器 CPU 使用率在任何时候都不会超过yarn.nodemanager.resource.percentage-physical-cpu-limit 中设置的限制。
注意
CPU 资源隔离利用了 Linux 内核中的高级功能。此时,由于已知的内核恐慌,不建议将yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 设置为 true。此外,对于某些内核,将yarn.nodemanager.resource.percentage-physical-cpu-limit 设置为小于 100 的值可能会导致内核崩溃。如果您需要这些功能中的任何一个,则必须执行规模测试以确定使用中的内核和工作负载是否稳定。作为起点,Linux 内核版本 4.8.1 可以使用这些功能。但是,使用所需的工作负载测试功能非常重要。