

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

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

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

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

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

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

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

**重新配置操作**  
当您使用 Amazon EMR 控制台、 Amazon Command Line Interface Amazon CLI() 或 Amazon 软件开发工具包提交重新配置请求时，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.amazonaws.cn/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.amazonaws.cn/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 的 Amazon 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.amazonaws.cn/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. 登录 Amazon Web Services 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/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.amazonaws.cn/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:
```