

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

# 重新設定執行中叢集中的執行個體群組
<a name="emr-configure-apps-running-cluster"></a>

透過 Amazon EMR 5.21.0 版及更新版本，您可以重新設定叢集組態，並為執行中叢集的每個執行個體群組指定額外組態分類。若要這樣做，您可以使用 Amazon EMR 主控台、 AWS Command Line Interface (AWS CLI) 或 AWS SDK。

當您在新 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 SDK 提交重新組態請求時，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 會復原至先前運作版本的組態參數。  
若要避免重新組態失敗，建議您僅在您計劃使用的叢集上安裝應用程式。我們也建議您在提交重新組態請求之前，先確保所有叢集應用程式都運作狀態良好且正常執行。

**重新組態的類型**  
您可以透過以下兩種方式之一重新設定執行個體群組：  
+ **覆寫**。預設重新組態方法，也是 5.35.0 和 6.6.0 之前的 Amazon EMR 版本中唯一可用的方法。此重新組態方法會使用新提交的組態集不加區別地覆寫任何叢集上的檔案。此方法會清除在重新組態 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 版不提供支援。
+ 只有 Amazon EMR 5.30.0 版及更新版本支援 HBase 組態分類的重新組態請求，而 Amazon EMR 5.23.0 至 5.29.0 版不提供支援。
+ Amazon EMR 僅在 Amazon EMR 5.27.0 版及更新版本中支援具有多個主節點的 Amazon EMR 叢集上的應用程式重新組態請求。
+ 具有多個主節點的 Amazon EMR 叢集不支援重新設定 `hdfs-encryption-zones` 分類或任何 Hadoop KMS 組態分類。
+ 對於需要重新啟動 YARN ResourceManager 的容量排程器，Amazon EMR 目前不支援特定重新組態請求。例如，您無法完全移除佇列。

## 在主控台中重新設定執行個體群組
<a name="emr-configure-apps-running-cluster-console"></a>

**注意**  
Amazon EMR 主控台不支援**合併**類型重新組態。

1. 在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台

1. 在叢集清單中的**名稱**下，選擇您要重新設定的作用中叢集。

1. 開啟叢集的叢集詳細資訊頁面，然後移至**組態**標籤。

1. 在 **Filter (篩選條件)** 下拉式清單中，選取您想要重新設定的執行個體群組。

1. 在**重新設定**下拉式功能表中，選擇**在資料表中編輯**或**在 JSON 檔案中編輯**。
   + **在資料表中編輯** – 在組態分類資料表中，編輯現有組態的屬性和值，或選擇**新增組態**以提供其他組態分類。
   + **在 JSON 檔案中編輯** – 直接在 JSON 中輸入組態，或使用速記語法 (以陰影文字示範)。否則，使用 JSON `Configurations` 物件來提供檔案的 Amazon S3 URI。
**注意**  
組態分類資料表的**來源**資料欄指示組態是在建立叢集時，還是在為此執行個體群組指定額外組態時提供。您可以從這兩個來源編輯執行個體群組的組態。您無法刪除初始叢集組態，但可以覆寫執行個體群組的這類組態。  
您也可以直接在表格中新增或編輯巢狀組態分類。例如，若要提供 `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** 命令，為執行中叢集中的執行個體群組指定新組態。

**注意**  
在下列範例中，以您的叢集 ID 取代 *<j-2AL4XXXXXX5T9>* 並以您的執行個體群組 ID 取代 *<ig-1xxxxxxx9>*。

**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 – 使用**合併**類型重新組態將組態新增至執行個體群組**  
在想要使用預設**覆寫**重新組態方法新增組態時，您必須在新的 `ModifyInstanceGroup` 請求中包含先前為該執行個體群組指定的所有組態。否則，**覆寫**會移除您先前指定的組態。您無需使用**合併**重新組態來執行此動作。相反，您必須確保您的請求僅包含新組態。  
下列範例新增 YARN NodeManager 虛擬記憶體檢查程式的屬性。由於這是**合併**類型重新組態，因此不會覆寫先前針對 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>

**注意**  
在下列範例中，以您的叢集 ID 取代 *<j-2AL4XXXXXX5T9>* 並以您的執行個體群組 ID 取代 *<ig-1xxxxxxx9>*。

下列程式碼片段使用 適用於 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 連接至重新組態失敗的節點。如需說明，請參閱《Amazon EC2** Linux 執行個體使用者指南》**中的[連接至 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 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon 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 版本。

下列範例顯示了早於 5.32.0 和 6.2.0 版的 Amazon EMR 發行版本的錯誤資訊。

```
- !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:
```