

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

# 使用 Amazon EMR 的早期 AMI 版本自定义集群和应用程序配置
<a name="emr-3x-customizeappconfig"></a>

Amazon EMR 发行版 4.0.0 推出了使用配置分类的精简应用程序配置方法。有关更多信息，请参阅 [配置应用程序](emr-configure-apps.md)。当使用 AMI 版本时，使用引导操作以及您传递的参数配置应用程序。例如，`configure-hadoop` 和 `configure-daemons` 引导操作设置 Hadoop 和 YARN 特定环境属性（如 `--namenode-heap-size`）。在更新的版本中，这些属性是使用 `hadoop-env` 和 `yarn-env` 配置分类配置的。有关执行常见配置的引导操作，请参阅 [Github 上的emr-bootstrap-actions 存储库](https://github.com/awslabs/emr-bootstrap-actions)。

以下各表将引导操作映射到更新的 Amazon EMR 发行版中的配置分类。


**Hadoop**  

| 受影响的应用程序文件名 | AMI 版本引导操作 | 配置分类 | 
| --- | --- | --- | 
| core-site.xml  | configure-hadoop -c  | core-site | 
| log4j.properties  | configure-hadoop -l  | hadoop-log4j | 
| hdfs-site.xml  | configure-hadoop -s  | hdfs-site  | 
| 不适用 | 不适用 | hdfs-encryption-zones | 
| mapred-site.xml  | configure-hadoop -m  | mapred-site | 
| yarn-site.xml  | configure-hadoop -y  | yarn-site | 
| httpfs-site.xml  | configure-hadoop -t  | httpfs-site | 
| capacity-scheduler.xml  | configure-hadoop -z  | capacity-scheduler | 
| yarn-env.sh  | configure-daemons --resourcemanager-opts | yarn-env | 


**Hive**  

| 受影响的应用程序文件名 | AMI 版本引导操作 | 配置分类 | 
| --- | --- | --- | 
| hive-env.sh | 不适用 | hive-env | 
| hive-site.xml | hive-script --install-hive-site \$1\$1MY\$1HIVE\$1SITE\$1FILE\$1 | hive-site | 
| hive-exec-log4j.properties | 不适用 | hive-exec-log4j | 
| hive-log4j.properties | 不适用 | hive-log4j | 


**EMRFS**  

| 受影响的应用程序文件名 | AMI 版本引导操作 | 配置分类 | 
| --- | --- | --- | 
| emrfs-site.xml | configure-hadoop -e | emrfs-site | 
| 不适用 | s3get -s s3://custom-provider.jar -d /usr/share/aws/emr/auxlib/ | emrfs-site (带新设置 fs.s3.cse.encryptionMaterialsProvider.uri) | 

有关所有分类的列表，请参阅[配置应用程序](emr-configure-apps.md)。

## 应用程序环境变量
<a name="emr-3x-appenv"></a>

当使用 AMI 版本时，将结合使用 `hadoop-user-env.sh` 脚本与 `configure-daemons` 引导操作来配置 Hadoop 环境。该脚本包括以下操作：

```
#!/bin/bash 
export HADOOP_USER_CLASSPATH_FIRST=true; 
echo "HADOOP_CLASSPATH=/path/to/my.jar" >> /home/hadoop/conf/hadoop-user-env.sh
```

在 Amazon EMR 版本 4.x 中，使用 `hadoop-env` 配置分类执行相同的操作，如以下示例中所示：

```
[ 
      { 
         "Classification":"hadoop-env",
         "Properties":{ 

         },
         "Configurations":[ 
            { 
               "Classification":"export",
               "Properties":{ 
                  "HADOOP_USER_CLASSPATH_FIRST":"true",
                  "HADOOP_CLASSPATH":"/path/to/my.jar"
               }
            }
         ]
      }
   ]
```

再举一例，使用 `configure-daemons` 并传递 `--namenode-heap-size=2048` 和 `--namenode-opts=-XX:GCTimeRatio=19` 等效于以下配置分类。

```
[ 
      { 
         "Classification":"hadoop-env",
         "Properties":{ 

         },
         "Configurations":[ 
            { 
               "Classification":"export",
               "Properties":{ 
                  "HADOOP_DATANODE_HEAPSIZE":  "2048",
           	"HADOOP_NAMENODE_OPTS":  "-XX:GCTimeRatio=19"
               }
            }
         ]
      }
   ]
```

其他应用程序环境变量不再在 `/home/hadoop/.bashrc` 中定义。相反，它们主要在 `/etc/default` 文件中基于每个组件或应用程序设置，例如 `/etc/default/hadoop`。应用程序`/usr/bin/`安装的 Wrapper 脚本也 RPMs 可以在涉及实际的 bin 脚本之前设置其他环境变量。

## 服务端口
<a name="emr-3x-serviceports"></a>

当使用 AMI 版本时，某些服务使用自定义端口。


**端口设置中的更改**  

| 设置 | AMI 版本 3.x | 开源默认值 | 
| --- | --- | --- | 
| fs.default.name | hdfs://emrDeterminedIP:9000 | 默认 (hdfs: //: 8020emrDeterminedIP)  | 
| dfs.datanode.address | 0.0.0.0:9200 | 默认值 (0.0.0.0:50010)  | 
| dfs.datanode.http.address | 0.0.0.0:9102 | 默认值 (0.0.0.0:50075)  | 
| dfs.datanode.https.address | 0.0.0.0:9402 | 默认值 (0.0.0.0:50475) | 
| dfs.datanode.ipc.address | 0.0.0.0:9201 | 默认值 (0.0.0.0:50020) | 
| dfs.http.address | 0.0.0.0:9101 | 默认值 (0.0.0.0:50070)  | 
| dfs.https.address | 0.0.0.0:9202 | 默认值 (0.0.0.0:50470)  | 
| dfs.secondary.http.address | 0.0.0.0:9104 | 默认值 (0.0.0.0:50090) | 
| yarn.nodemanager.address | 0.0.0.0:9103 | 默认值 (\$1\$1yarn.nodemanager.hostname\$1:0)  | 
| yarn.nodemanager.localizer.address  | 0.0.0.0:9033 | 默认值 (\$1\$1yarn.nodemanager.hostname\$1:8040) | 
| yarn.nodemanager.webapp.address | 0.0.0.0:9035 | 默认值 (\$1\$1yarn.nodemanager.hostname\$1:8042) | 
| yarn.resourcemanager.address | emrDeterminedIP:9022 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8032) | 
| yarn.resourcemanager.admin.address | emrDeterminedIP:9025 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8033) | 
| yarn.resourcemanager.resource-tracker.address | emrDeterminedIP:9023 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8031) | 
| yarn.resourcemanager.scheduler.address | emrDeterminedIP:9024 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8030) | 
| yarn.resourcemanager.webapp.address | 0.0.0.0:9026  | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8088) | 
| yarn.web-proxy.address | emrDeterminedIP:9046  | 默认值 (无值)  | 
| yarn.resourcemanager.hostname | 0.0.0.0 (默认值)  | emrDeterminedIP | 

**注意**  
*emrDeterminedIP*是由 Amazon EMR 生成的 IP 地址。

## Users
<a name="emr-3x-users"></a>

当使用 AMI 版本时，用户 `hadoop` 将运行所有进程并拥有所有文件。在 Amazon EMR 版本 4.0.0 及更高版本中，用户位于应用程序和组件级别。

## 安装顺序、安装的构件和日志文件位置
<a name="emr-3x-directories"></a>

当使用 AMI 版本时，应用程序构件及其配置目录安装在 `/home/hadoop/application` 目录中。例如，如果已安装 Hive，目录将是 `/home/hadoop/hive`。在 Amazon EMR 版本 4.0.0 及更高版本中，应用程序构件安装在 `/usr/lib/application` 目录中。当使用 AMI 版本时，日志文件位于不同的位置。下表列出了位置。


**Amazon S3 上的日志位置的更改**  

| 守护进程或应用程序 | 目录位置 | 
| --- | --- | 
| instance-state | node/ /instance-state/ instance-id | 
| hadoop-hdfs-namenode | daemons//.log instance-id hadoop-hadoop-namenode | 
| hadoop-hdfs-datanode | daemons//.log instance-id hadoop-hadoop-datanode | 
| hadoop-yarn () ResourceManager | 守护进程//instance-idyarn-hadoop-resourcemanager | 
| hadoop-yarn (代理服务器)  | 守护进程//instance-idyarn-hadoop-proxyserver | 
| mapred-historyserver | 守护进程//instance-id | 
| httpfs | daemons/ /httpfs.log instance-id | 
| hive-server | node/ /hive-server/hive-server.log instance-id | 
| hive-metastore | node/ /apps/hive.log instance-id | 
| Hive CLI | node/ /apps/hive.log instance-id | 
| YARN 应用程序用户日志和容器日志 | task-attempts/ | 
| Mahout | 不适用 | 
| Pig | 不适用 | 
| spark-historyserver | 不适用 | 
| mapreduce 任务历史记录文件 | jobs/ | 

## Command Runner
<a name="emr-differences-commandrunner"></a>

当使用 AMI 版本时，许多脚本或程序 (如 `/home/hadoop/contrib/streaming/hadoop-streaming.jar`) 未位于 shell 登录路径环境上，因此您需要在使用 jar 文件 (如 command-runner.jar 或 script-runner.jar) 执行脚本时指定完整路径。`command-runner.jar` 位于 AMI 上，因此无需知道完整 URI，这与 `script-runner.jar` 的情况相同。

## 重复因子
<a name="emr-3x-replication"></a>

重复因子使您可以配置启动 Hadoop JVM 的时间。您可以为每个任务启动一个新的 Hadoop JVM，这样可以提供更好的任务隔离，或者可以在任务 JVMs 之间共享，从而降低框架开销。如果您处理的是许多小文件，合理的做法是多次重复使用 JVM，以摊销启动成本。然而，如果每项任务耗时较长或处理的数据量较大，您可以选择不重复使用 JVM，以确保释放出所有内存供后续任务使用。当使用 AMI 版本时，您可以使用 `configure-hadoop` 引导操作设置 `mapred.job.reuse.jvm.num.tasks` 属性来自定义重复因子。

以下示例演示如何设置无限 JVM 重复使用的 JVM 重复使用因子。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.11.0 \
--applications Name=Hue Name=Hive Name=Pig \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge \
InstanceGroupType=CORE,InstanceCount=2,InstanceType=m3.xlarge \
--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,\
Name="Configuring infinite JVM reuse",Args=["-m","mapred.job.reuse.jvm.num.tasks=-1"]
```