

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

# 重新配置 Amazon EMR 集群的实例集
<a name="instance-fleet-reconfiguration"></a>

对于 Amazon EMR 5.21.0 和更高版本，您可以重新配置集群应用程序，并为运行的集群中的每个实例集指定额外的配置分类。为此，您可以使用 AWS 命令行界面 (AWS CLI) 或 AWS SDK。

您可以通过查看 CloudWatch 事件来跟踪实例队列的状态。有关更多信息，请参阅[实例集重新配置事件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html#emr-cloudwatch-instance-fleet-events-reconfig)。

**注意**  
您只能覆盖在集群创建期间指定的集群 Configurations 对象。有关配置对象的更多信息，请参阅[RunJobFlow 请求语法](https://docs.aws.amazon.com/emr/latest/APIReference/API_RunJobFlow.html#API_RunJobFlow_RequestSyntax)。如果现有配置与您提供的文件之间存在差异，Amazon EMR 会将手动修改的配置（例如您在使用 SSH 连接到集群时修改的配置）重置为指定实例集的集群默认设置。

当您使用 Amazon EMR 控制台、 AWS 命令行界面AWS CLI() 或 AWS 软件开发工具包提交重新配置请求时，Amazon EMR 会检查现有的集群配置文件。如果现有配置与您提供的文件之间存在差异，Amazon EMR 会启动重新配置操作，重新启动某些应用程序，并将任何手动修改的配置（例如您在使用 SSH 连接到集群时修改的配置）重置为指定实例集的集群默认设置。

## 重新配置行为
<a name="instance-fleet-reconfiguration-behaviors"></a>

重新配置会使用新提交的配置集来覆盖集群上的配置，并且可以覆盖在重新配置 API 之外进行的配置更改。

Amazon EMR 执行滚动过程来重新配置任务和核心实例集中的实例。每次只会修改和重启特定实例类型的一部分实例。如果您的实例集有多种不同的实例类型配置，它们将并行重新配置。

重新配置是在[InstanceTypeConfig](https://docs.aws.amazon.com/emr/latest/APIReference/API_InstanceTypeConfig.html)级别上声明的。有关视觉示例，请参阅[重新配置实例集](#instance-fleet-reconfiguration-cli-sdk)。您可以在单个请求中提交包含一个或多个实例类型的更新配置设置的重新配置请求。您必须在修改请求中包括您的实例集中的所有实例类型；但是，配置字段已填充的实例类型将进行重新配置，而实例集中的其他 `InstanceTypeConfig` 实例保持不变。只有当指定实例类型的所有实例都完成重新配置时，重新配置才被视为成功。如果任何实例重新配置失败，则整个实例集将自动恢复到其上次已知的稳定配置。

## 限制
<a name="instance-fleet-reconfiguration-limitations"></a>

在重新配置正在运行的集群中的实例集时，请考虑以下限制：
+ 尤其是在应用程序未正确配置时，非 YARN 应用程序可能会在重新启动期间失败或导致集群问题。接近最大内存和 CPU 使用率的集群可能会在重新启动过程后遇到问题。对于主实例集而言，情况尤其如此。请参阅[排查实例集重新配置问题](#instance-fleet-reconfiguration-troubleshooting)部分。
+ 调整大小和重新配置操作不会并行进行。重新配置请求将等待正在进行的调整大小，反之亦然。
+ 调整大小和重新配置操作不会并行进行。重新配置请求将等待正在进行的调整大小，反之亦然。
+ 在重新配置实例集后，Amazon EMR 将重新启动应用程序，从而使新配置生效。如果在重新配置期间正在使用应用程序，则可能会出现作业失败或其它意外应用程序行为。
+ 如果某实例集下任何实例类型配置的重新配置失败，Amazon EMR 会将整个实例集的配置参数恢复为以前的有效版本，同时发出事件并更新状态详细信息。如果恢复过程也失败，您必须提交新的 `ModifyInstanceFleet` 请求以从 `ARRESTED` 状态恢复实例集。恢复失败会导致[实例集重新配置事件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html#emr-cloudwatch-instance-fleet-events-reconfig)和状态更改。
+ 仅在 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 集群上不支持重新配置 hdfs-encryption-zones 分类或任何 Hadoop KMS 配置分类。
+ Amazon EMR 目前不支持某些需要重新启动 YARN 的 YARN 容量调度程序的重新配置请求。 ResourceManager例如，您无法完全删除队列。
+ 当 YARN 需要重启时，所有正在运行的 YARN 作业通常会终止并丢失。这可能会导致数据处理延迟。要在 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)。

## 重新配置实例集
<a name="instance-fleet-reconfiguration-cli-sdk"></a>

------
#### [ Using the AWS CLI ]

使用 `modify-instance-fleet` 命令为正在运行的集群中的一个实例集指定新配置。

**注意**  
在以下示例中，将 **j-2 AL4 XXXXXX5 T9** 替换为您的集群 ID，将 i **f-1xxxxxxx** 9 替换为您的实例队列 ID。

**示例：替换实例集的配置**

**警告**  
指定您在启动时使用的所有 `InstanceTypeConfig` 字段。不包括字段可能会导致覆盖您在启动时声明的规范。有关列表 [InstanceTypeConfig](https://docs.aws.amazon.com/emr/latest/APIReference/API_InstanceTypeConfig.html)，请参阅。

以下示例引用了一个名为 instanceFleet.json 的配置 JSON 文件，用于编辑实例队列的 YARN NodeManager 磁盘运行状况检查器的属性。

**实例集修改 JSON**

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

   ```
   {
       "InstanceFleetId":"if-1xxxxxxx9",
       "InstanceTypeConfigs": [
               {
                   "InstanceType": "m5.xlarge",
                  other InstanceTypeConfig fields
                   "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"
                           }
                       }
                   ]
               },
               {
                   "InstanceType": "r5.xlarge",
                  other InstanceTypeConfig fields
                   "Configurations": [
                       {
                           "Classification": "yarn-site",
                           "Properties": {
                               "yarn.nodemanager.disk-health-checker.enable":"false",
                               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"70.0"
                           }
                       }
                   ]
               }
           ]
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-fleet \
   --cluster-id j-2AL4XXXXXX5T9 \
   --region us-west-2 \
   --instance-fleet instanceFleet.json
   ```

**示例：向实例集添加配置**

如果要向实例类型添加配置，还必须在新的 `ModifyInstanceFleet` 请求中包含以前为实例集指定的配置。否则，将删除以前指定的配置。

以下示例为 YARN NodeManager 虚拟内存检查器添加了一个属性。该配置还包括之前为 YARN NodeManager 磁盘运行状况检查器指定的值，因此这些值不会被覆盖。

1. 在 instanceFleet.json 中准备以下内容，并将其保存在您将运行命令的同一目录中。

   ```
   {
       "InstanceFleetId":"if-1xxxxxxx9",
       "InstanceTypeConfigs": [
               {
                   "InstanceType": "m5.xlarge",
                   other InstanceTypeConfig fields
                   "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"
                           }
                       }
                   ]
               },
               {
                   "InstanceType": "r5.xlarge",
                   other InstanceTypeConfig fields
                   "Configurations": [
                       {
                           "Classification": "yarn-site",
                           "Properties": {
                               "yarn.nodemanager.disk-health-checker.enable":"false",
                               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"70.0"
                           }
                       }
                   ]
               }
           ]      
   }
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-fleet \
   --cluster-id j-2AL4XXXXXX5T9 \
   --region us-west-2 \
   --instance-fleet instanceFleet.json
   ```

------
#### [ using the Java SDK ]

**注意**  
在以下示例中，将 **j-2 AL4 XXXXXX5 T9** 替换为您的集群 ID，将 i **f-1xxxxxxx** 9 替换为您的实例队列 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 newConfiguration = new Configuration()
    .withClassification("hive-site")
    .withProperties(hiveProperties);
    
List<InstanceTypeConfig> instanceTypeConfigList = new ArrayList<>();

for (InstanceTypeConfig instanceTypeConfig : currentInstanceTypeConfigList) {
    instanceTypeConfigList.add(new InstanceTypeConfig()
        .withInstanceType(instanceTypeConfig.getInstanceType())
        .withBidPrice(instanceTypeConfig.getBidPrice())
        .withWeightedCapacity(instanceTypeConfig.getWeightedCapacity())
        .withConfigurations(newConfiguration)
    );
}

InstanceFleetModifyConfig instanceFleetModifyConfig = new InstanceFleetModifyConfig()
    .withInstanceFleetId("if-1xxxxxxx9")
    .withInstanceTypeConfigs(instanceTypeConfigList);
    
ModifyInstanceFleetRequest modifyInstanceFleetRequest = new ModifyInstanceFleetRequest()
    .withInstanceFleet(instanceFleetModifyConfig)
    .withClusterId("j-2AL4XXXXXX5T9");

emrClient.modifyInstanceFleet(modifyInstanceFleetRequest);
```

------

## 排查实例集重新配置问题
<a name="instance-fleet-reconfiguration-troubleshooting"></a>

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

`Amazon EMR couldn't revert the instance fleet if-1xxxxxxx9 in the Amazon EMR cluster j-2AL4XXXXXX5T9 (ExampleClusterName) to the previously successful configuration at 2021-01-01 00:00 UTC. The reconfiguration reversion failed because of Instance i-xxxxxxx1, i-xxxxxxx2, i-xxxxxxx3 failed with message "This is an example failure message"...`

### 访问节点预置日志
<a name="instance-fleet-reconfiguration-troubleshooting-connect-node"></a>

使用 SSH 连接到重新配置失败的节点。有关说明，请参阅 *Amazon Elastic Compute Cloud* 中的[连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

------
#### [ Accessing logs by connecting to a node ]

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

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

1. 打开报告子目录并搜索节点预置报告，从而进行重新配置。报告目录根据重新配置版本号、通用唯一标识符 (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
   ```

------
#### [ Accessing logs using Amazon S3 ]

登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。打开您在配置集群时指定的 Amazon S3 存储桶，以便将日志文件存档。

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

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

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

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

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

------

每个日志文件都包含关联重新配置的详细预配置报告。要查找错误消息信息，您可以搜索报告的 `err` 日志级别。报告格式取决于集群上的 Amazon EMR 版本。以下示例显示了 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:
```