

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

# 為您的 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)。

**注意**  
您只能覆寫叢集建立期間指定的叢集組態物件。如需組態物件的詳細資訊，請參閱 [RunJobFlow 請求語法](https://docs.aws.amazon.com/emr/latest/APIReference/API_RunJobFlow.html#API_RunJobFlow_RequestSyntax)。如果現有組態與您提供的檔案之間存在差異，Amazon EMR 會將手動修改的組態重設為指定執行個體機群的叢集預設值，例如您使用 SSH 連線至叢集時修改的組態。

當您使用 Amazon EMR 主控台、 AWS 命令列界面 (AWS CLI) 或 AWS SDK 提交重新組態請求時，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 版不提供支援。
+ 只有 Amazon EMR 5.30.0 版及更新版本支援 HBase 組態分類的重新組態請求，而 Amazon EMR 5.23.0 至 5.29.0 版不提供支援。
+ 在具有多個主節點的 Amazon EMR 叢集上，不支援重新設定 hdfs-encryption-zones 分類或任何 Hadoop KMS 組態分類。
+ Amazon EMR 目前不支援需要重新啟動 YARN ResourceManager 的 YARN 容量排程器的特定重新設定請求。例如，您無法完全移除佇列。
+ 當 YARN 需要重新啟動時，所有執行中的 YARN 任務通常會終止並遺失。這可能會導致資料處理延遲。若要在 YARN 重新啟動期間執行 YARN 任務，您可以建立具有多個主節點的 Amazon EMR 叢集，或在 yarn-site 組態分類`true`中將 yarn.resourcemanager.recovery.enabled 設定為 。如需有關使用多個主節點的詳細資訊，請參閱[高可用性 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-2AL4XXXXXX5T9** 取代為您的叢集 ID，並將 **if-1xxxxxxx9** 取代為您的執行個體機群 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-2AL4XXXXXX5T9** 取代為您的叢集 ID，並將 **if-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 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 Events 事件記錄失敗訊息。此事件提供重新組態失敗的簡短摘要。它會列出重新組態失敗的執行個體，以及對應的失敗訊息。以下是失敗訊息範例。

`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 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon 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:
```