

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

# 配置应用程序
<a name="emr-configure-apps"></a>

您可以提供配置对象来覆盖应用程序的默认配置。您也可以使用简写语法提供配置，或者引用 JSON 文件中的配置对象。配置对象包含分类、属性和可选的嵌套配置。属性对应于您想要更改的应用程序设置。您可以在一个 JSON 对象中为多个应用程序指定多个分类。

**警告**  
Amazon EMR Describe 和 List API 操作以明文形式发出自定义和可配置的设置，用作 Amazon EMR 作业流程的一部分。要在这些设置中提供密码等敏感信息，请参阅将[在 AWS Secrets Manager中存储敏感配置数据](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/storing-sensitive-data.html)。

可用的配置分类因 Amazon EMR 发行版而异。有关特定发行版中所支持配置分类的列表，请参阅 [关于 Amazon EMR 发行版](emr-release-components.md)下有关该发行版的页面。

以下是一组配置的示例 JSON 文件。

```
[
  {
    "Classification": "core-site",
    "Properties": {
      "hadoop.security.groups.cache.secs": "250"
    }
  },
  {
    "Classification": "mapred-site",
    "Properties": {
      "mapred.tasktracker.map.tasks.maximum": "2",
      "mapreduce.map.sort.spill.percent": "0.90",
      "mapreduce.tasktracker.reduce.tasks.maximum": "5"
    }
  }
]
```

配置分类通常可以映射到应用程序特定的配置文件。例如，`hive-site` 分类映射到 Hive 的 `hive-site.xml` 配置文件中的设置。此情况的一个例外是不再支持的引导操作 `configure-daemons`，它用于设置 `--namenode-heap-size` 等环境参数。与此类似的选项已归入 `hadoop-env` 和 `yarn-env` 分类，并具有自己的嵌套导出分类。如果任何分类以 `env` 结尾，请使用导出子分类。

另一个例外是 `s3get`，它用于将客户 `EncryptionMaterialsProvider` 对象放置在集群中的每个节点上来进行客户端加密。为了实现此目的，已向 `emrfs-site` 分类添加一个选项。

以下是一个 `hadoop-env` 分类示例。

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

以下是一个 yarn-env 分类示例。

```
[
  {
    "Classification": "yarn-env",
    "Properties": {
      
    },
    "Configurations": [
      {
        "Classification": "export",
        "Properties": {
          "YARN_RESOURCEMANAGER_OPTS": "-Xdebug -Xrunjdwp:transport=dt_socket"
        },
        "Configurations": [
          
        ]
      }
    ]
  }
]
```

以下设置不属于配置文件，但由 Amazon EMR 用来代表您配置多个设置。


**由 Amazon EMR 辅助设置**  

| 应用程序 | 发行版标注分类 | 有效属性 | 何时使用 | 
| --- | --- | --- | --- | 
| Spark | spark | maximizeResourceAllocation | 配置执行程序以利用每个节点的最大资源。 | 

**Topics**
+ [在创建集群时配置应用程序](emr-configure-apps-create-cluster.md)
+ [在正在运行的集群中重新配置实例组](emr-configure-apps-running-cluster.md)
+ [将敏感配置数据存储在 AWS Secrets Manager](storing-sensitive-data.md)
+ [配置应用程序来使用特定 Java 虚拟机](configuring-java8.md)

# 在创建集群时配置应用程序
<a name="emr-configure-apps-create-cluster"></a>

创建集群时，您可以使用 Amazon EMR 控制台、 AWS Command Line Interface (AWS CLI) 或软件开发工具包覆盖应用程序的默认配置。 AWS 

要覆盖应用程序的原定设置配置，您需要指定某个配置分类中的自定义值。配置分类对应于应用程序的配置 XML 文件，例如 `hive-site.xml`。

配置分类因 Amazon EMR 发行版而异。有关特定发行版中可用配置分类的列表，请参阅该发行版的详细信息页面。例如，[Amazon EMR 发行版 6.4.0。](emr-640-release.md#emr-640-class)

## 在创建集群时，在控制台中提供配置
<a name="emr-configure-apps-create-cluster-console"></a>

要提供配置，请导航到**创建集群**页面并展开**软件设置**。然后，您可以在控制台中使用 JSON 或以阴影文本表示的简写语法直接输入配置。否则，您可以为具有 JSON `Configurations` 对象的文件提供一个 Amazon S3 URI。

要为实例组提供配置，请在集群列表中选择一个集群，然后选择**配置**选项卡。在**实例组配置**表中，选择要编辑的实例组，然后选择**重新配置**。

## 创建集群 AWS CLI 时使用提供配置
<a name="emr-configure-apps-create-cluster-cli"></a>

您可通过提供本地存储或在 Amazon S3 中存储的 JSON 文件的路径来为 **create-cluster** 提供配置。以下示例假定您使用 Amazon EMR 的默认角色，并且已创建这些角色。如果您需要创建角色，请先运行 `aws emr create-default-roles`。

如果您的配置位于本地目录中，您可以使用示例命令。

```
aws emr create-cluster --use-default-roles --release-label emr-7.12.0 --applications Name=Hive \
--instance-type m5.xlarge --instance-count 3 --configurations file://./configurations.json
```

如果您的配置位于 Amazon S3 路径中，则需要设置以下解决方法，然后才能将 Amazon S3 路径传递给 `create-cluster` 命令。

```
#!/bin/sh
# Assume the ConfigurationS3Path is not public, and its present in the same AWS account as the EMR cluster
ConfigurationS3Path="s3://amzn-s3-demo-bucket/config.json"
# Get a presigned HTTP URL for the s3Path
ConfigurationURL=`aws s3 presign $ConfigurationS3Path --expires-in 300`
# Fetch the presigned URL, and minify the JSON so that it spans only a single line
Configurations=`curl $ConfigurationURL | jq -c .`
aws emr create-cluster --use-default-roles --release-label emr-5.34.0 --instance-type m5.xlarge --instance-count 2 --applications Name=Hadoop Name=Spark --configurations $Configurations
```

## 在创建集群时，使用 Java SDK 提供配置
<a name="emr-configure-apps-create-cluster-sdk"></a>

以下程序摘要说明如何使用 适用于 Java 的 AWS SDK提供配置。

```
Application hive = new Application().withName("Hive");

Map<String,String> hiveProperties = new HashMap<String,String>();
	hiveProperties.put("hive.join.emit.interval","1000");
	hiveProperties.put("hive.merge.mapfiles","true");
	    
Configuration myHiveConfig = new Configuration()
	.withClassification("hive-site")
	.withProperties(hiveProperties);

RunJobFlowRequest request = new RunJobFlowRequest()
	.withName("Create cluster with ReleaseLabel")
	.withReleaseLabel("emr-5.20.0")
	.withApplications(hive)
	.withConfigurations(myHiveConfig)
	.withServiceRole("EMR_DefaultRole")
	.withJobFlowRole("EMR_EC2_DefaultRole")
	.withInstances(new JobFlowInstancesConfig()
		.withEc2KeyName("myEc2Key")
		.withInstanceCount(3)
		.withKeepJobFlowAliveWhenNoSteps(true)
		.withMasterInstanceType("m4.large")
		.withSlaveInstanceType("m4.large")
	);
```

# 在正在运行的集群中重新配置实例组
<a name="emr-configure-apps-running-cluster"></a>

对于 Amazon EMR 5.21.0 和更高版本，您可以重新配置集群应用程序，并为运行的集群中的每个实例组指定额外的配置分类。为此，您可以使用 Amazon EMR 控制台、 AWS Command Line Interface (AWS CLI) 或软件开发工具包。 AWS 

当您在新的 Amazon EMR 控制台中更新实例组的应用程序配置时，控制台会尝试将新配置与现有配置合并，从而创建新的活动配置。在 Amazon EMR 无法合并配置的不寻常情况下，控制台会提醒您。

在为实例组提交重新配置请求后，Amazon EMR 为新配置规范分配一个版本号。您可以通过查看 CloudWatch 事件来跟踪配置的版本号或实例组的状态。有关更多信息，请参阅[监控 CloudWatch 事件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html)。

**注意**  
您只能覆盖（而不能删除）集群创建过程中指定的集群配置。如果现有配置与您提供的文件之间存在差异，Amazon EMR 会将手动修改的配置（例如您在使用 SSH 连接到集群时修改的配置）重置为指定实例组的集群原定设置。

## 重新配置实例组时的注意事项
<a name="emr-configure-apps-running-cluster-considerations"></a>

**重新配置操作**  
当您使用 Amazon EMR 控制台、 AWS Command Line Interface AWS CLI() 或 AWS 软件开发工具包提交重新配置请求时，Amazon EMR 会检查现有的集群配置文件。如果现有配置与您提供的文件之间存在差异，Amazon EMR 会启动重新配置操作，重新启动某些应用程序，并将任何手动修改的配置（例如您在使用 SSH 连接到集群时修改的配置）重置为指定实例组的集群原定设置。  
Amazon EMR 会在每个实例组重新配置期间执行一些默认操作。这些默认操作可能与您所做的集群自定义冲突，并导致重新配置失败。如何对重新配置失败问题进行故障排查的相关信息，请参阅[对实例组重新配置问题进行故障排查](#emr-configure-apps-running-cluster-troubleshoot)。
Amazon EMR 还会对您在请求中指定的配置分类启动重新配置操作。有关这些操作的完整列表，请参阅您使用的 Amazon EMR 版本的“配置分类”部分。例如，[6.2.0 配置分类](emr-620-release.md#emr-620-class)。  
Amazon EMR 版本指南中仅列出从 Amazon EMR 5.32.0 和 6.2.0 版开始的重新配置操作。

**服务中断**  
Amazon EMR 执行“滚动”过程来重新配置任务和核心实例组中的实例。只能同时修改并重新启动实例组中的 10% 实例。该过程需要更长的时间才能完成，但降低了在运行的集群中发生潜在应用程序故障的可能性。  
要在 YARN 重新启动期间运行 YARN 作业，您可以创建一个具有多个主节点的 Amazon EMR 集群，也可以在您的 `yarn-site` 配置分类中将 `yarn.resourcemanager.recovery.enabled` 设置为 `true`。有关使用多个主节点的更多信息，请参阅[高可用性 YARN ResourceManager](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-ha-applications.html#emr-plan-ha-applications-YARN)。

**应用程序验证**  
在重新配置重新启动过程后，Amazon EMR 会检查集群上的每个应用程序是否正在运行。如果任何应用程序不可用，则整个重新配置操作失败。如果重新配置失败，则 Amazon EMR 将配置参数恢复为以前正常工作的版本。  
为避免重新配置失败，我们建议您仅在计划使用的集群上安装应用程序。我们还建议您在提交重新配置请求之前，先确保所有集群应用程序均正在正常运行。

**重新配置的类型**  
您可以以两种方式之一重新配置实例组重新配置实例组：  
+ **覆盖**。默认的重新配置方法和 Amazon EMR 5.35.0 和 6.6.0 之前的版本中提供的唯一方法。此重新配置方法不加区分地使用新提交的配置集覆盖任何集群上的文件。该方法会擦除在重新配置 API 之外对配置文件进行的任何更改。
+ **合并**。重新配置方法支持 Amazon EMR 版本 5.35.0 以及 6.6.0 和更高版本，Amazon EMR 控制台除外，在该控制台中，没有版本支持它。此重新配置方法合并新提交的配置与已经存在于集群中的配置。此选项仅添加或修改您提交的新配置。它会保留现有的配置。
Amazon EMR 继续覆盖它需要的一些基本 Hadoop 配置，以确保该服务正确运行。

**限制**

在重新配置正在运行的集群中的实例组时，请考虑以下限制：
+ 尤其是在应用程序未正确配置时，非 YARN 应用程序可能会在重新启动期间失败或导致集群问题。接近最大内存和 CPU 使用率的集群可能会在重新启动过程后遇到问题。对于主实例组而言，情况尤其如此。
+ 当实例组调整大小时，您无法提交重新配置请求。如果在调整实例组大小时启动重新配置，在实例组完成大小调整后，才能启动重新配置，反之亦然。
+ 在重新配置实例组后，Amazon EMR 将重新启动应用程序，从而使新配置生效。如果在重新配置期间正在使用应用程序，则可能会出现作业失败或其它意外应用程序行为。
+ 如果实例组重新配置失败，则 Amazon EMR 将配置参数恢复为以前正常工作的版本。如果恢复过程也失败，您必须提交新的 `ModifyInstanceGroup` 请求以从 `SUSPENDED` 状态中恢复实例组。
+ 仅在 Amazon EMR 5.23.0 和更高版本中支持 Phoenix 配置分类的重新配置请求，在 Amazon EMR 5.21.0 或 5.22.0 版本中不支持该请求。
+ 只有亚马逊 EMR 版本 5.30.0 及更高版本支持 HBase 配置分类的重新配置请求，亚马逊 EMR 版本 5.23.0 至 5.29.0 不支持重新配置请求。
+ 仅在 Amazon EMR 版本 5.27.0 及更高版本中，Amazon EMR 支持在具有多个主节点的 Amazon EMR 集群上的应用程序重新配置请求。
+ 具有多个主节点的 Amazon EMR 集群上不支持重新配置 `hdfs-encryption-zones` 分类或任何 Hadoop KMS 配置分类。
+ Amazon EMR 目前不支持某些需要重启 YARN 的容量调度器重新配置请求。 ResourceManager例如，您无法完全删除队列。

## 在控制台中重新配置实例组
<a name="emr-configure-apps-running-cluster-console"></a>

**注意**  
Amazon EMR 控制台不支持**合并**类型重新配置。

1. [在 /emr 上打开亚马逊 EMR 控制台 https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在集群列表中，在 **Name (名称)** 下面选择要重新配置的活动集群。

1. 打开集群的集群详细信息页面，然后转到 **Configurations (配置)** 选项卡。

1. 在 **Filter (筛选条件)** 下拉列表中，选择要重新配置的实例组。

1. 在 **Reconfigure (重新配置)** 下拉菜单中，选择 **Edit in table (在表中编辑)** 或 **Edit in JSON file (在 JSON 文件中编辑)**。
   + **Edit in table (在表中编辑)**：在配置分类表中，编辑现有配置的属性和值，或者选择 **Add configuration (添加配置)** 来提供额外的配置分类。
   + **Edit in JSON file (在 JSON 文件中编辑)**：直接在 JSON 中输入配置，也可以使用简写语法（以阴影文本表示）。否则，请为具有 JSON `Configurations` 对象的文件提供一个 Amazon S3 URI。
**注意**  
配置分类表中的 **Source (源)** 列表示是在您创建集群时提供配置，还是在您为该实例组指定额外的配置时提供配置。您可以编辑来自两个来源的实例组配置。您无法删除初始集群配置，但可以覆盖实例组的这些配置。  
您还可以直接在表中添加或编辑嵌套的配置分类。例如，要提供 `hadoop-env` 的额外 `export` 子分类，请在表中添加一个 `hadoop.export` 配置分类。然后，为该分类提供特定的属性和值。

1. （可选）选择 **Apply this configuration to all active instance groups (将该配置应用于所有活动实例组)**。

1. 保存更改。

## 使用 CLI 重新配置实例组
<a name="emr-configure-apps-running-cluster-cli"></a>

使用 **modify-instance-groups** 命令为运行的集群中的一个实例组指定新配置。

**注意**  
在以下示例中，*<j-2AL4XXXXXX5T9>*替换为您的集群 ID，然后*<ig-1xxxxxxx9>*替换为您的实例组 ID。

**Example ：替换实例组的配置**  
以下示例引用了一个名`instanceGroups.json`为的配置 JSON 文件，该文件用于编辑实例组的 YARN NodeManager 磁盘运行状况检查器的属性。  

1. 准备配置分类，并在运行命令的相同目录中将其保存为 `instanceGroups.json`。

   ```
   [
      {
         "InstanceGroupId":"<ig-1xxxxxxx9>",
         "Configurations":[
            {
               "Classification":"yarn-site",
               "Properties":{
                  "yarn.nodemanager.disk-health-checker.enable":"true",
                  "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"100.0"
               },
               "Configurations":[]
            }
         ]
      }
   ]
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-groups --cluster-id <j-2AL4XXXXXX5T9> \
   --instance-groups file://instanceGroups.json
   ```

**Example ：为实例组添加配置**  
如果要为实例组添加配置，还必须在新的 `ModifyInstanceGroup` 请求中包含以前为实例组指定的配置。否则，将删除以前指定的配置。  
以下示例为 YARN NodeManager 虚拟内存检查器添加了一个属性。该配置还包括之前为 YARN NodeManager 磁盘运行状况检查器指定的值，因此这些值不会被覆盖。  

1. 准备 `instanceGroups.json` 文件中具有的以下内容，并将其保存到您将在其中运行该命令的同一目录中。

   ```
   [
      {
         "InstanceGroupId":"<ig-1xxxxxxx9>",
         "Configurations":[
            {
               "Classification":"yarn-site",
               "Properties":{
                  "yarn.nodemanager.disk-health-checker.enable":"true",
                  "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"100.0",
                  "yarn.nodemanager.vmem-check-enabled":"true",
                  "yarn.nodemanager.vmem-pmem-ratio":"3.0"
               },
               "Configurations":[]
            }
         ]
      }
   ]
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-groups --cluster-id <j-2AL4XXXXXX5T9> \
   --instance-groups file://instanceGroups.json
   ```

**Example ：使用 **Merge**（合并）类型重新配置将配置添加到实例组中**  
当您想要使用默认的**覆盖**重新配置方法添加配置时，您必须在新 `ModifyInstanceGroup` 请求中包括该实例组的所有以前指定的配置。否则，**覆盖**会删除您以前指定的配置。您不需要使用**合并**重新配置执行此操作。相反，您必须确保您的请求仅包括新配置。  
以下示例为 YARN NodeManager 虚拟内存检查器添加了一个属性。由于这是 **Merge** 类型的重新配置，因此它不会覆盖之前为 YARN NodeManager 磁盘运行状况检查器指定的值。  

1. 准备 `instanceGroups.json` 文件中具有的以下内容，并将其保存到您将在其中运行该命令的同一目录中。

   ```
   [
      {"InstanceGroupId":"<ig-1xxxxxxx9>",
       "ReconfigurationType" :"MERGE",
         "Configurations":[
            {"Classification":"yarn-site",
               "Properties":{
                  "yarn.nodemanager.vmem-check-enabled":"true",
                  "yarn.nodemanager.vmem-pmem-ratio":"3.0"
               },
               "Configurations":[]
            }
         ]
      }
   ]
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-groups --cluster-id <j-2AL4XXXXXX5T9> \
   --instance-groups file://instanceGroups.json
   ```

**Example ：删除实例组的配置**  
要删除实例组的配置，请提交新的重新配置请求以排除以前的配置。  
您只能覆盖初始*集群*配置。您无法删除该配置。
例如，要从上一个示例中删除 YARN NodeManager 磁盘运行状况检查器的配置，请提交`instanceGroups.json`包含以下内容的新配置。  

```
[
   {
      "InstanceGroupId":"<ig-1xxxxxxx9>",
      "Configurations":[
         {
            "Classification":"yarn-site",
            "Properties":{
               "yarn.nodemanager.vmem-check-enabled":"true",
               "yarn.nodemanager.vmem-pmem-ratio":"3.0"
            },
            "Configurations":[]
         }
      ]
   }
]
```
要删除上一重新配置请求中的所有配置，请提交包含一组空配置的重新配置请求。例如：  

```
[
   {
      "InstanceGroupId":"<ig-1xxxxxxx9>",
      "Configurations":[]
   }
]
```

**Example ：在一个请求中重新配置实例组并调整其大小**  
以下示例 JSON 说明了如何在同一请求中重新配置实例组并调整其大小。  

```
[
   {
      "InstanceGroupId":"<ig-1xxxxxxx9>",
      "InstanceCount":5,
      "EC2InstanceIdsToTerminate":["i-123"],
      "ForceShutdown":true,
      "ShrinkPolicy":{
         "DecommissionTimeout":10,
         "InstanceResizePolicy":{
            "InstancesToTerminate":["i-123"],
            "InstancesToProtect":["i-345"],
            "InstanceTerminationTimeout":20
         }
      },
      "Configurations":[
         {
            "Classification":"yarn-site",
            "Configurations":[],
            "Properties":{
               "yarn.nodemanager.disk-health-checker.enable":"true",
               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"100.0"
            }
         }
      ]
   }
]
```

## 使用 Java SDK 重新配置实例组
<a name="emr-configure-apps-running-cluster-sdk"></a>

**注意**  
在以下示例中，*<j-2AL4XXXXXX5T9>*替换为您的集群 ID，然后*<ig-1xxxxxxx9>*替换为您的实例组 ID。

以下代码段使用 适用于 Java 的 AWS SDK为实例组提供新配置。

```
AWSCredentials credentials = new BasicAWSCredentials("access-key", "secret-key");
AmazonElasticMapReduce emr = new AmazonElasticMapReduceClient(credentials);

Map<String,String> hiveProperties = new HashMap<String,String>();
hiveProperties.put("hive.join.emit.interval","1000");
hiveProperties.put("hive.merge.mapfiles","true");
        
Configuration configuration = new Configuration()
    .withClassification("hive-site")
    .withProperties(hiveProperties);
    
InstanceGroupModifyConfig igConfig = new InstanceGroupModifyConfig()
    .withInstanceGroupId("<ig-1xxxxxxx9>")
    .withReconfigurationType("MERGE");
    .withConfigurations(configuration);

ModifyInstanceGroupsRequest migRequest = new ModifyInstanceGroupsRequest()
    .withClusterId("<j-2AL4XXXXXX5T9>")
    .withInstanceGroups(igConfig);

emr.modifyInstanceGroups(migRequest);
```

以下代码段通过提供一组空配置来删除以前为实例组指定的配置。

```
List<Configuration> configurations = new ArrayList<Configuration>();

InstanceGroupModifyConfig igConfig = new InstanceGroupModifyConfig()
    .withInstanceGroupId("<ig-1xxxxxxx9>")
    .withConfigurations(configurations);

ModifyInstanceGroupsRequest migRequest = new ModifyInstanceGroupsRequest()
    .withClusterId("<j-2AL4XXXXXX5T9>")
    .withInstanceGroups(igConfig);

emr.modifyInstanceGroups(migRequest);
```

## 对实例组重新配置问题进行故障排查
<a name="emr-configure-apps-running-cluster-troubleshoot"></a>

如果实例组的重新配置过程失败，Amazon EMR 会恢复重新配置并使用 Amazon 事件记录失败消息。 CloudWatch 此事件能够提供该重新配置失败的简短摘要。其会列出重新配置失败的实例以及相应的失败消息。下面是一个失败消息示例。

```
The reconfiguration operation for instance group ig-1xxxxxxx9 in Amazon EMR cluster j-2AL4XXXXXX5T9 (ExampleClusterName) 
failed at 2021-01-01 00:00 UTC and took 2 minutes to fail. Failed configuration version is example12345. 
Failure message: Instance i-xxxxxxx1, i-xxxxxxx2, i-xxxxxxx3 failed with message "This is an example failure message".
```

要收集有关重新配置失败的更多数据，您可以检查节点预配置日志。对于收到类似以下消息时，这样做尤其有用。

```
i-xxxxxxx1 failed with message “Unable to complete transaction and some changes were applied.”
```

------
#### [ On the node ]

**通过连接到节点来访问节点预配置日志**

1. 使用 SSH 连接到重新配置失败的节点。有关说明，请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》****中的[连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)。

1. 导航到以下包含节点预置日志文件的目录。

   ```
   /mnt/var/log/provision-node/
   ```

1. 打开 `reports` 子目录并搜索节点预置报告，从而进行重新配置。`reports` 目录根据重新配置版本号、通用唯一标识符（UUID）、Amazon EC2 实例 IP 地址和时间戳来组织日志。每个报告都是一个压缩的 YAML 文件，其中包含有关重新配置过程的详细信息。

   以下为报告文件名和路径的示例。

   ```
   /reports/2/ca598xxx-cxxx-4xxx-bxxx-6dbxxxxxxxxx/ip-10-73-xxx-xxx.ec2.internal/202104061715.yaml.gz
   ```

1. 您可以使用文件查看器（如以下示例中的 `zless`）来查看报告。

   ```
   zless 202104061715.yaml.gz
   ```

------
#### [ Amazon S3 ]

**使用 Amazon S3 来访问节点预配置日志**

1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 打开您在配置集群时指定的 Amazon S3 存储桶，以便将日志文件存档。

1. 导航到以下包含节点预配置日志文件的文件夹：

   ```
   amzn-s3-demo-bucket/elasticmapreduce/<cluster id>/node/<instance id>/provision-node/
   ```

1. 打开 `reports` 文件夹并搜索节点预配置报告，从而进行重新配置。`reports` 文件夹根据重新配置版本号、通用唯一标识符（UUID）、Amazon EC2 实例 IP 地址和时间戳来组织日志。每个报告都是一个压缩的 YAML 文件，其中包含有关重新配置过程的详细信息。

   以下为报告文件名和路径的示例。

   ```
   /reports/2/ca598xxx-cxxx-4xxx-bxxx-6dbxxxxxxxxx/ip-10-73-xxx-xxx.ec2.internal/202104061715.yaml.gz
   ```

1. 要查看日志文件，您可以将其作为文本文件从 Amazon S3 下载到本地计算机。有关说明，请参阅[下载对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)。

------

每个日志文件都包含关联重新配置的详细预配置报告。要查找错误消息信息，您可以搜索报告的 `err` 日志级别。报告格式取决于集群上的 Amazon EMR 版本。

以下示例显示了早于 Amazon EMR 5.32.0 和 6.2.0 发行版的错误信息。

```
- !ruby/object:Puppet::Util::Log
      level: !ruby/sym err
      tags: 
        - err
      message: "Example detailed error message."
      source: Puppet
      time: 2021-01-01 00:00:00.000000 +00:00
```

Amazon EMR 5.32.0 和 6.2.0 及更高发行版使用以下格式。

```
- level: err
  message: 'Example detailed error message.'
  source: Puppet
  tags:
  - err
  time: '2021-01-01 00:00:00.000000 +00:00'
  file: 
  line:
```

# 将敏感配置数据存储在 AWS Secrets Manager
<a name="storing-sensitive-data"></a>

Amazon EMR 描述并列出了以明文形式发出自定义配置数据（例如 `DescribeCluster` 和 `ListInstanceGroups`）的 API 操作。Amazon EMR 与集成， AWS Secrets Manager 因此您可以将数据存储在 Secrets Manager 中，并在配置中使用秘密 ARN。这样，您就不会以明文形式将敏感配置数据传递给 Amazon EMR，也不会将其暴露给外部。 APIs如果您指明键值对包含存储在 Secrets Manager 中的密钥 ARN，Amazon EMR 则会在向集群发送配置数据时检索此密钥。当 Amazon EMR 使用外部 APIs 来显示配置时，它不会发送注释。

## 创建密钥
<a name="create-secret"></a>

要创建密钥，请遵循《AWS Secrets Manager 用户指南》**中[创建 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)的说明。在**步骤 3** 中，必须选择 **Plaintext**（明文）字段来输入您的敏感值。

请注意，虽然 Secrets Manager 允许密钥最多包含 65536 个字节，但 Amazon EMR 将属性键（不包括注释）和检索到的密钥值的组合长度限制为 1024 个字符。

## 授予 Amazon EMR 检索密钥的访问权限
<a name="grant-access"></a>

Amazon EMR 使用 IAM 服务角色为您预置和管理集群。Amazon EMR 服务角色定义在预置资源，以及执行在集群中运行的特定 Amazon EC2 实例的上下文中不执行的服务级任务时，允许 Amazon EMR 执行的操作。有关服务角色的更多信息，请参阅 [Amazon EMR 的服务角色（EMR 角色）](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role.html)和[自定义 IAM 角色](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-roles-custom.html)。

要允许 Amazon EMR 从 Secrets Manager 检索密钥值，请在启动集群时将下面的策略声明添加到您的 Amazon EMR 角色中。

```
{
   "Sid":"AllowSecretsRetrieval",
   "Effect":"Allow",
   "Action":"secretsmanager:GetSecretValue",
   "Resource":[
      "arn:aws:secretsmanager:<region>:<aws-account-id>:secret:<secret-name>"
   ]
}
```

如果您使用客户管理的密钥创建密钥 AWS KMS key，则还必须为 Amazon EMR 角色添加对您使用的密钥的`kms:Decrypt`权限。有关更多信息，请参阅 *AWS Secrets Manager 用户指南*中的 [AWS Secrets Manager的身份验证和访问控制](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html)。

## 在配置分类中使用密钥
<a name="config-secret"></a>

您可以向任何配置属性添加 `EMR.secret@` 注释，以表明其键值对包含存储在 Secrets Manager 中的密钥 ARN。

以下示例演示如何在配置分类中提供密钥 ARN：

```
{
   "Classification":"core-site",
   "Properties":{
      "presto.s3.access-key":"<sensitive-access-key>",
      "EMR.secret@presto.s3.secret-key":"arn:aws:secretsmanager:<region>:<aws-account-id>:secret:<secret-name>"
   }
}
```

在创建集群并提交注释的配置后，Amazon EMR 会验证配置属性。如果您的配置有效，Amazon EMR 将从配置中删除注释并从 Secrets Manager 中检索该密钥以创建实际配置，然后再将其应用于集群：

```
{
   "Classification":"core-site",
   "Properties":{
      "presto.s3.access-key":"<sensitive-access-key>",
      "presto.s3.secret-key":"<my-secret-key-retrieved-from-Secrets-Manager>"
   }
}
```

当您调用类似 `DescribeCluster` 的操作时，Amazon EMR 将返回集群上的当前应用程序配置。如果应用程序配置属性被标记为包含密钥 ARN，则 `DescribeCluster` 调用返回的应用程序配置包含 ARN 而不是密钥值。这样可以确保密钥值仅在集群上可见：

```
{
   "Classification":"core-site",
   "Properties":{
      "presto.s3.access-key":"<sensitive-access-key>",
      "presto.s3.secret-key":"arn:aws:secretsmanager:<region>:<aws-account-id>:secret:<secret-name>"
   }
}
```

## 更新密钥值
<a name="update-secret"></a>

每当连接的实例组启动、重新配置或调整大小时，Amazon EMR 都会从注释的配置中检索密钥值。您可以使用 Secrets Manager 修改正在运行的集群的配置中使用的密钥的值。完成后，您可以向想要接收更新值的每个实例组提交重新配置请求。如需详细了解如何重新配置实例组以及重新配置时需要考虑的事项，请参阅 [在正在运行的集群中重新配置实例组](emr-configure-apps-running-cluster.md)。

# 配置应用程序来使用特定 Java 虚拟机
<a name="configuring-java8"></a>

Amazon EMR 版本具有不同的默认 Java 虚拟机（JVM）版本。本页介绍了 JVM 对不同版本和应用程序的支持。

## 注意事项
<a name="configuring-java8-considerations"></a>

有关支持的应用程序 Java 版本的信息，请参阅《Amazon EMR 发行版指南》[关于 Amazon EMR 发行版](emr-release-components.md)中的应用程序页面。
+ Amazon EMR 仅支持在一个集群中运行一个运行时系统版本，不支持在同一集群上的不同运行时系统版本上运行不同的节点或应用程序。
+ 对于 Amazon EMR 7.x，支持 Java 17 的应用程序的默认 Java 虚拟机（JVM）为 Java 17，Apache Livy 除外。有关支持的应用程序 Java 版本的更多信息，请参阅《Amazon EMR 发行版指南》中相应的发布页面。
+ 从 Amazon EMR 7.1.0 开始，Flink 支持并默认设置为 Java 17。要使用其他版本的 Java 运行时，请覆盖 `flink-conf` 中的设置。有关配置 Flink 以使用 Java 8 或 Java 11 的更多信息，请参阅[将 Flink 配置为使用 Java 11 运行](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/flink-configure.html#flink-configure-java11)。
+ 对于 Amazon EMR 5.x 和 6.x，默认的 Java 虚拟机（JVM）为 Java 8。
  + 对于 Amazon EMR 6.12.0 及更高版本，某些应用程序还支持 Java 11 和 17。
  + 对于 Amazon EMR 6.9.0 及更高版本，Trino 默认支持 Java 17。有关 Trino 上 Java 17 的更多信息，请参阅 Trino 博客上的 [Trino updates to Java 17](https://trino.io/blog/2022/07/14/trino-updates-to-java-17.html)。

在选择运行时系统版本时，请记住以下特定于应用程序的注意事项：


**特定于应用程序的 Java 配置说明**  

| 应用程序 | Java 配置说明 | 
| --- | --- | 
| Spark | 要使用非默认 Java 版本运行 Spark，必须同时配置 Spark 和 Hadoop。有关示例，请参阅 [覆盖 JVM](#configuring-java8-override)。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/configuring-java8.html) | 
| Spark RAPIDS | 您可以使用为 Spark 配置的 Java 版本运行 RAPIDS。 | 
| Iceberg | 您可以使用正在使用 Iceberg 的应用程序的已配置 Java 版本来运行 Iceberg。 | 
| Delta | 您可以使用正在使用 Delta 的应用程序的已配置 Java 版本来运行 Delta。 | 
| Hudi | 您可以使用正在使用 Hudi 的应用程序的已配置 Java 版本来运行 Hudi。 | 
| Hadoop | 要更新适用于 Hadoop 的 JVM，请修改 `hadoop-env`。有关示例，请参阅 [覆盖 JVM](#configuring-java8-override)。 | 
| Hive | 要将 Hive 的 Java 版本设置为 11 或 17，请将 Hadoop JVM 设置配置为要使用的 Java 版本。 | 
| HBase | 要更新的 JVM HBase，请修改`hbase-env`。默认情况下，除非您覆盖中的 HBase 设置，否则 Amazon EMR 会根据 Hadoop 的 JVM 配置来设置 JVM。`hbase-env`有关示例，请参阅 [覆盖 JVM](#configuring-java8-override)。 | 
| Flink | 要更新适用于 Flink 的 JVM，请修改 `flink-conf`。默认情况下，除非您覆盖 `flink-conf` 中的设置，否则 Amazon EMR 会根据 Hadoop 的 JVM 配置来设置 Flink JVM。有关更多信息，请参阅 [将 Flink 配置为使用 Java 11 运行](flink-configure.md#flink-configure-java11)。 | 
| Oozie | 要将 Oozie 配置为在 Java 11 或 17 上运行，请配置 Oozie Server、Oozie LauncherAM Launcher AM，然后更改客户端可执行文件和作业配置。您也可以将 `EmbeddedOozieServer` 配置为在 Java 17 上运行。有关更多信息，请参阅 [为 Oozie 配置 Java 版本](oozie-java.md)。 | 
| Pig | Pig 仅支持 Java 8。您无法在 Hadoop 中使用 Java 11 或 17，也不能在同一个集群上运行 Pig。 | 

## 覆盖 JVM
<a name="configuring-java8-override"></a>

要覆盖 Amazon EMR 版本的 JVM 设置：例如，在使用 Amazon EMR 版本 6.12.0 的集群中使用 Java 17，请为其环境分类提供 `JAVA_HOME` 设置，该设置对于除 Flink 之外的所有应用程序都为 `application-env`。对于 Flink 来说，环境分类是 `flink-conf`。有关使用 Flink 配置 Java 运行时系统的步骤，请参阅 [将 Flink 配置为使用 Java 11 运行](flink-configure.md#flink-configure-java11)。

**Topics**
+ [使用 Apache Spark 覆盖 JVM 设置](#configuring-java8-override-spark)
+ [使用 Apache 重写 JVM 设置 HBase](#configuring-java8-override-hbase)
+ [使用 Apache Hadoop 和 Hive 覆盖 JVM 设置](#configuring-java8-override-hadoop)

### 使用 Apache Spark 覆盖 JVM 设置
<a name="configuring-java8-override-spark"></a>

在 Amazon EMR 6.12 及更高版本中使用 Spark 时，您可以设置环境，以便执行程序使用 Java 11 或 17。而且，当您在低于 5.x 的 Amazon EMR 版本中使用 Spark 并编写驱动程序以在集群模式下提交时，驱动程序会使用 Java 7。不过，您可以设置环境以确保执行程序使用 Java 8。

要覆盖 Spark 的 JVM，请设置 Spark 分类设置。在此示例中，Hadoop 的 Java 版本相同，但这不是必需的。

```
[
{
"Classification": "hadoop-env", 
        "Configurations": [
            {
"Classification": "export", 
                "Configurations": [], 
                "Properties": {
"JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
                }
            }
        ], 
        "Properties": {}
    }, 
    {
"Classification": "spark-env", 
        "Configurations": [
            {
"Classification": "export", 
                "Configurations": [], 
                "Properties": {
"JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
                }
            }
        ], 
        "Properties": {}
    }
]
```

请注意，对于 Amazon EMR 上的 Hadoop，建议的最佳做法是所有 Hadoop 组件的 JVM 版本保持一致。

 以下示例展示了如何为 EMR 7.0.0\$1 添加所需的配置参数，以确保所有组件使用一致的 Java 版本。

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executorEnv.JAVA_HOME": "/usr/lib/jvm/java-1.8.0",
      "spark.yarn.appMasterEnv.JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
    }
  },
  {
    "Classification": "hadoop-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
        }
      }
    ],
    "Properties": {}
  },
  {
    "Classification": "spark-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
        }
      }
    ],
    "Properties": {}
  }
]
```

### 使用 Apache 重写 JVM 设置 HBase
<a name="configuring-java8-override-hbase"></a>

 HBase 要配置为使用 Java 11，可以在启动集群时设置以下配置。

```
[
    {
        "Classification": "hbase-env",
        "Properties": {},
        "Configurations": [
            {
                "Classification": "export",
                "Properties": {
                    "JAVA_HOME": "/usr/lib/jvm/jre-11",
                    "HBASE_OPTS": "-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -Dsun.net.inetaddr.ttl=5"
                },
                "Configurations": []
            }
        ]
    }
]
```

### 使用 Apache Hadoop 和 Hive 覆盖 JVM 设置
<a name="configuring-java8-override-hadoop"></a>

以下示例说明如何将 Hadoop 和 Hive 的 JVM 设置为版本 17。

```
[
    {
        "Classification": "hadoop-env", 
            "Configurations": [
                {
                    "Classification": "export", 
                    "Configurations": [], 
                    "Properties": {
                        "JAVA_HOME": "/usr/lib/jvm/jre-17"
                    }
                }
        ], 
        "Properties": {}
    }
]
```

## 服务端口
<a name="configuring-java8-service-ports"></a>

以下是 YARN 和 HDFS 服务端口。这些设置反映 Hadoop 默认值。其它应用程序服务托管在默认端口上，除非另有指定。有关更多信息，请参阅应用程序的项目文档。


**YARN 和 HDFS 的端口设置**  

| 设置 | 主机名/端口 | 
| --- | --- | 
| `fs.default.name` | 默认值（`hdfs://emrDeterminedIP:8020`） | 
| `dfs.datanode.address` | 默认值（`0.0.0.0:50010`） | 
| `dfs.datanode.http.address` | 默认值（`0.0.0.0:50075`） | 
| `dfs.datanode.https.address` | 默认值（`0.0.0.0:50475`） | 
| `dfs.datanode.ipc.address` | 默认值（`0.0.0.0:50020`） | 
| `dfs.http.address` | 默认值（`0.0.0.0:50070`） | 
| `dfs.https.address` | 默认值（`0.0.0.0:50470`） | 
| `dfs.secondary.http.address` | 默认值（`0.0.0.0:50090`） | 
| `yarn.nodemanager.address` | 默认值（`${yarn.nodemanager.hostname}:0`） | 
| `yarn.nodemanager.localizer.address` | 默认值（`${yarn.nodemanager.hostname}:8040`） | 
| `yarn.nodemanager.webapp.address` | 默认值（`${yarn.nodemanager.hostname}:8042`） | 
| `yarn.resourcemanager.address` | 默认值（`${yarn.resourcemanager.hostname}:8032`） | 
| `yarn.resourcemanager.admin.address` | 默认值（`${yarn.resourcemanager.hostname}:8033`） | 
| `yarn.resourcemanager.resource-tracker.address` | 默认值（`${yarn.resourcemanager.hostname}:8031`） | 
| `yarn.resourcemanager.scheduler.address` | 默认值（`${yarn.resourcemanager.hostname}:8030`） | 
| `yarn.resourcemanager.webapp.address` | 默认值（`${yarn.resourcemanager.hostname}:8088`） | 
| `yarn.web-proxy.address` | 默认值（`no-value`） | 
| `yarn.resourcemanager.hostname` | `emrDeterminedIP` | 

**注意**  
该术语*emrDeterminedIP*是由 Amazon EMR 控制平面生成的 IP 地址。在较新的版本中，已删除该约定，但 `yarn.resourcemanager.hostname` 和 `fs.default.name` 设置除外。

## 应用程序用户
<a name="configuring-java8-application-users"></a>

应用程序以自己的用户身份运行进程。例如，Hive 以用户身份 JVMs 运行`hive`、以用户身份 MapReduce JVMs 运行`mapred`，依此类推。在以下进程状态示例中说明了这一点。

```
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hive      6452  0.2  0.7 853684 218520 ?       Sl   16:32   0:13 /usr/lib/jvm/java-openjdk/bin/java -Xmx256m -Dhive.log.dir=/var/log/hive -Dhive.log.file=hive-metastore.log -Dhive.log.threshold=INFO -Dhadoop.log.dir=/usr/lib/hadoop
hive      6557  0.2  0.6 849508 202396 ?       Sl   16:32   0:09 /usr/lib/jvm/java-openjdk/bin/java -Xmx256m -Dhive.log.dir=/var/log/hive -Dhive.log.file=hive-server2.log -Dhive.log.threshold=INFO -Dhadoop.log.dir=/usr/lib/hadoop/l
hbase     6716  0.1  1.0 1755516 336600 ?      Sl   Jun21   2:20 /usr/lib/jvm/java-openjdk/bin/java -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -Xmx1024m -ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dhbase.log.dir=/var/
hbase     6871  0.0  0.7 1672196 237648 ?      Sl   Jun21   0:46 /usr/lib/jvm/java-openjdk/bin/java -Dproc_thrift -XX:OnOutOfMemoryError=kill -9 %p -Xmx1024m -ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dhbase.log.dir=/var/
hdfs      7491  0.4  1.0 1719476 309820 ?      Sl   16:32   0:22 /usr/lib/jvm/java-openjdk/bin/java -Dproc_namenode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-namenode-ip-10-71-203-213.log -Dhadoo
yarn      8524  0.1  0.6 1626164 211300 ?      Sl   16:33   0:05 /usr/lib/jvm/java-openjdk/bin/java -Dproc_proxyserver -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-yarn-
yarn      8646  1.0  1.2 1876916 385308 ?      Sl   16:33   0:46 /usr/lib/jvm/java-openjdk/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-y
mapred    9265  0.2  0.8 1666628 260484 ?      Sl   16:33   0:12 /usr/lib/jvm/java-openjdk/bin/java -Dproc_historyserver -Xmx1000m -Dhadoop.log.dir=/usr/lib/hadoop/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/lib/hadoop
```