

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

# 为 YARN 容器开启非统一内存访问感知功能
<a name="hadoop-numa"></a>

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

当 Worker 节点计算机属于多 NUMA 节点时，可以为 YARN 容器启用 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":[]
   	}
    ]
   ```

1. 在集群中提供以下引导操作。

   ```
   #!/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
   ```

1. 每个容器都必须能够感知 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>
   ```

1. 要验证您是否已开启 NUMA，请使用以下命令搜索任何 NodeManager 日志文件。

   ```
   grep "NUMA resources allocation is enabled," *
   ```

   要验证是否 NodeManager 已将NUMA节点资源分配给容器，请使用以下命令搜索 NodeManager 日志，`<container_id>`替换为您自己的容器 ID。

   ```
   grep "NUMA node" | grep <container_id>
   ```