

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為 YARN 容器啟用非統一記憶體存取感知
<a name="hadoop-numa"></a>

透過 Amazon EMR 6.x 版及更新版本，您可以使用非統一記憶體存取 (NUMA) 在叢集上多重處理資料。NUMA 是一種電腦記憶體設計模式，其中處理器可以比另一個處理器上的記憶體或處理器之間共用的記憶體更快地存取自己的本機記憶體。YARN 容器在使用 NUMA 時具有更好的效能，因為它們可以繫結至服務所有後續記憶體分配的特定 NUMA 節點。這減少了叢集存取遠端記憶體的次數。

在工作節點機器是多 NUMA 節點時，您可以開啟對 YARN 容器的 NUMA 支援。若要確認工作節點是單 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>
   ```