为 YARN 容器开启非统一内存访问感知功能 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为 YARN 容器开启非统一内存访问感知功能

在 Amazon EMR 6.x 及更高版本中,您可以使用非统一的内存访问权限 (NUMA) 用于对集群上的数据进行多重处理。NUMA 是一种计算机内存设计模式,在这种模式下,处理器访问自己的本地内存的速度要快于其他处理器上的内存或在处理器之间共享的内存。YARN 容器的性能更好 NUMA 因为它们可以绑定到特定的 NUMA 为所有后续内存分配提供服务的节点。这可以减少集群访问远程内存的次数。

你可以开启 NUMA 当工作节点机器是多机时,支持 YARN 容器NUMA 节点。要确认工作节点是否为单节点NUMA 或多-NUMA 节点,运行以下命令。

lscpu | grep -i numa NUMA node(s): 2

通常,大于 12 倍的实例有两个 NUMA 节点。这不适用于裸机实例。

要开启 NUMA 对 YARN 容器的认识
  1. 在您的 Amazon EMR 6.x 集群中使用以下 yarn-site 配置。

    [ { "classification":"yarn-site", "properties":{ "yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user":"yarn", "yarn.nodemanager.linux-container-executor.group":"yarn", "yarn.nodemanager.container-executor.class":"org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor", "yarn.nodemanager.numa-awareness.enabled":"true", "yarn.nodemanager.numa-awareness.numactl.cmd":"/usr/bin/numactl", "yarn.nodemanager.numa-awareness.read-topology":"true" }, "configurations":[] } ]
  2. 在集群中提供以下引导操作。

    #!/bin/bash sudo yum -y install numactl echo 1 | sudo tee /proc/sys/kernel/numa_balancing echo "banned.users=mapred,bin,hdfs" >> /etc/hadoop/conf/container-executor.cfg rm -rf /var/log/hadoop-yarn/ sudo chown -R yarn:hadoop /var/log/hadoop-yarn/ sudo chmod 755 -R /var/log/hadoop-yarn/ sudo chmod 6050 /etc/hadoop/conf/container-executor.cfg mkdir /mnt/yarn && sudo chmod 755 -R /mnt/yarn && sudo chown -R yarn:hadoop /mnt/yarn mkdir /mnt1/yarn && sudo chmod 755 -R /mnt1/yarn && sudo chown -R yarn:hadoop /mnt1/yarn mkdir /mnt2/yarn && sudo chmod 755 -R /mnt2/yarn && sudo chown -R yarn:hadoop /mnt2/yarn
  3. 每个容器都必须注意 NUMA。 您可以使用以下命令通知每个容器中的 Java 虚拟机 (JVM) NUMA 旗帜。例如,通知 JVM 使用 NUMA 在一个 MapReduce job,请在中添加以下属性mapred-site.xml

    <property> <name>mapreduce.reduce.java.opts</name> <value>-XX:+UseNUMA</value> </property> <property> <name>mapreduce.map.java.opts</name> <value>-XX:+UseNUMA</value> </property>
  4. 为了验证你是否转过身来 NUMA 开启,搜索任何 NodeManager 使用以下命令记录文件。

    grep "NUMA resources allocation is enabled," *

    验证是否 NodeManager 已分配 NUMA 节点资源到容器,使用以下命令搜索 NodeManager 日志,<container_id>替换为你自己的容器 ID。

    grep "NUMA node" | grep <container_id>