为容器开启非均匀内存访问感知 YARN - Amazon EMR

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

为容器开启非均匀内存访问感知 YARN

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

当工作节点计算机是多节点时,您可以启用对YARN容器的NUMA支持。NUMA要确认 Worker 节点是单 NUMA 还是多 NUMA 节点,请运行以下命令。

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

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

开启YARN容器NUMA感知功能
  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。您可以使用NUMA标记通知每个容器中的 Java 虚拟机 (JVM)。例如,要通知JVM要在MapReduce作业NUMA中使用,请在中添加以下属性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>