

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

# 了解 Amazon EMR 節點配置策略和案例
<a name="managed-scaling-allocation-strategy"></a>

本章節提供節點分配策略和常見擴展案例的概觀，可以與 Amazon EMR 受管擴展功能搭配使用。

## 節點配置策略
<a name="node-allocation-strategy"></a>

Amazon EMR 受管擴展功能可根據下列縱向擴展和縮減規模策略來分配核心節點和任務節點：

**縱向擴展策略**
+ 對於 Amazon EMR 7.2 版及更高版本，受管擴展會先根據節點標籤和應用程式程序限制 YARN 屬性新增節點。
+ 對於 Amazon EMR 7.2 版及更高版本，如果您啟用節點標籤並將應用程式程序限制為`CORE`節點，Amazon EMR 受管擴展會在應用程式程序需求增加且執行器需求增加時擴展核心節點和任務節點。同樣地，如果您啟用節點標籤並將應用程式程序限制為`ON_DEMAND`節點，受管擴展會在應用程式程序需求增加時擴展隨需節點，並在執行器需求增加時擴展 Spot 節點。
+ 如果未啟用節點標籤，則應用程式程序放置不會受限於任何節點或市場類型。
+ 透過使用節點標籤，受管擴展可以在相同的調整大小操作中擴展和縮減不同的執行個體群組和執行個體機群。例如，在 `instance_group1` 具有`ON_DEMAND`節點且`instance_group2`具有`SPOT`節點的情況下，會啟用節點標籤，且應用程式程序僅限於具有`ON_DEMAND`標籤的節點。`instance_group2` 如果應用程式程序需求減少`instance_group1`且執行器需求增加，受管擴展會縮減和擴展。
+ 當 Amazon EMR 在與目前執行個體群組的縱向擴展中遇到延遲時，使用受管擴展功能的叢集可自動切換到不同的任務執行個體群組。
+ 如果已設定 `MaximumCoreCapacityUnits` 參數，Amazon EMR 會擴展核心節點，直到核心單元達到允許的上限為止。所有剩餘容量都會新增至任務節點。
+ 如果已設定 `MaximumOnDemandCapacityUnits` 參數，Amazon EMR 會使用隨需執行個體來擴展叢集，直到隨需單位達到允許的上限為止。使用 Spot 執行個體新增所有剩餘容量。
+ 如果同時設定了 `MaximumCoreCapacityUnits` 和 `MaximumOnDemandCapacityUnits` 參數，Amazon EMR 會在擴展期間考慮這兩個限制。

  例如，如果 `MaximumCoreCapacityUnits` 小於 `MaximumOnDemandCapacityUnits`，Amazon EMR 會先擴展核心節點，直到達到核心容量限制為止。對於剩餘容量，Amazon EMR 首先使用隨需執行個體來擴展任務節點，直到達到隨需限制為止，然後將 Spot 執行個體用於任務節點。

**縮減規模策略**
+ 與擴展策略類似，Amazon EMR 會根據節點標籤移除節點。如需節點標籤的詳細資訊，請參閱[了解節點類型：主要節點、核心節點和任務節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)。
+ 如果您尚未啟用節點標籤，受管擴展會移除任務節點，然後移除核心節點，直到達到所需的縮減目標容量為止。受管擴展絕不會將叢集縮減到低於受管擴展政策中指定的最低限制。
+ Amazon EMR 5.34.0 版和更新版本，以及 Amazon EMR 6.4.0 版和更新版本，支援 Spark 隨機播放資料意識，可防止執行個體在 Managed Scaling 知道現有隨機播放資料時縮減。如需有關隨機排序操作的詳細資訊，請參閱[《Spark 程式設計指南》](https://spark.apache.org/docs/latest/rdd-programming-guide.html#shuffle-operations)。Managed Scaling 會盡力防止縮減任何作用中 Spark 應用程式目前和上一個階段的隨機播放資料節點，最長可達 30 分鐘。這有助於將意外隨機資料遺失降至最低，避免需要重新嘗試任務和重新計算中繼資料。不過，無法保證能夠防止隨機資料遺失。為了改善 Spark 隨機播放保護，我們建議對發行標籤為 7.4 或更新版本的叢集使用隨機播放意識。將下列旗標新增至叢集組態，以啟用改善的 Spark 隨機播放保護。
  + 如果`yarn.nodemanager.shuffledata-monitor.interval-ms`標記 （預設 30000 毫秒） 或 `spark.dynamicAllocation.executorIdleTimeout`（預設 60 秒） 已從預設值變更，請更新必要的標記`true`以確保條件`spark.dynamicAllocation.executorIdleTimeout > yarn.nodemanager.shuffledata-monitor.interval-ms`保持不變。

    ```
    [
    	{
    		"Classification": "yarn-site",
    		"Properties": { 
    		"yarn.resourcemanager.decommissioning-nodes-watcher.wait-for-shuffle-data": "true"
    		}
    	},
    	{
    		"Classification": "spark-defaults",
    		"Properties": {
    		"spark.dynamicAllocation.enabled": "true",
    		"spark.shuffle.service.removeShuffle": "true"
    		}
    	}
    ]
    ```
+ 受管擴展會先移除任務節點，然後移除核心節點，直到達到所需的縮減目標容量為止。叢集的擴展絕不會低於受管擴展政策中指定的最低限制。
+ 對於使用 Amazon EMR 5.x 5.34.0 版和更新版本以及 6.x 6.4.0 版和更新版本啟動的叢集，如果在其上執行的應用程式中有作用中階段，Amazon EMR Managed Scaling 不會縮減具有`ApplicationMaster`適用於 Apache Spark 的節點。這樣可以最大限度地減少作業失敗和重試，有助於提高作業績效並降低成本。若要確認叢集中的哪些節點正在執行 `ApplicationMaster`，請造訪 Spark 歷史記錄伺服器，並在 Spark 應用程式 ID 的**執行程式**索引標籤下篩選驅動程式。
+ 雖然使用 EMR Managed Scaling 的智慧型擴展可將 Spark 的隨機播放資料遺失降至最低，但在某些情況下，暫時隨機播放資料可能無法在縮減期間受到保護。若要在縮減規模期間提供隨機播放資料的增強彈性，建議您在 YARN 中**為隨機播放資料啟用 Graceful Decommissioning**。在 YARN 中為**隨機播放資料啟用 Graceful Decommissioning** 時，選取縮減規模且具有隨機播放資料的節點將進入**停止播放**狀態，並繼續提供隨機播放檔案。YARN ResourceManager 會等到節點報告不存在隨機播放檔案，再從叢集中移除節點。
  + Amazon EMR 6.11.0 版及更高版本支援 Tez 和 MapReduce Shuffle Handler 的 **Hive** 隨機播放資料以 Yarn 為基礎的優雅解除委任。
    + 將 `yarn.resourcemanager.decommissioning-nodes-watcher.wait-for-shuffle-data`設定為 ，以針對隨機播放資料啟用 Graceful Decommissioning`true`。
  + 啟用外部隨機播放服務時 （在 EC2 上的 EMR 中預設為啟用），Amazon EMR 7.4.0 版及更高版本支援以 Yarn 為基礎的 Spark 隨機播放資料正常停用。
    + 在 Yarn 上執行 Spark 時，Spark 外部隨機播放服務的預設行為是讓 Yarn NodeManager 在應用程式終止時移除應用程式隨機播放檔案。這可能會影響節點停用和運算使用率的速度。對於長時間執行的應用程式，請考慮`spark.shuffle.service.removeShuffle`將 設定為 `true`以移除不再使用的隨機播放檔案，讓沒有作用中隨機播放資料的節點能更快速解除委任。
  + 若要將 Amazon EMR 7.4.0 版及更高版本中的 Spark 隨機播放資料遺失降至最低，請考慮設定下列旗標。
    + 如果`yarn.nodemanager.shuffledata-monitor.interval-ms`標記 （預設 30000 毫秒） 或 `spark.dynamicAllocation.executorIdleTimeout`（預設 60 秒） 已從預設值變更，請`true`更新必要的標記以確保條件`spark.dynamicAllocation.executorIdleTimeout > yarn.nodemanager.shuffledata-monitor.interval-ms`仍然存在。

      ```
      [
      	{
      		"Classification": "yarn-site",
      		"Properties": { 
      		"yarn.resourcemanager.decommissioning-nodes-watcher.wait-for-shuffle-data": "true"
      		}
      	},
      	{
      		"Classification": "spark-defaults",
      		"Properties": {
      		"spark.dynamicAllocation.enabled": "true",
      		"spark.shuffle.service.removeShuffle": "true"
      		}
      	}
      ]
      ```

如果叢集沒有任何負載，則 Amazon EMR 會取消先前評估中新增的執行個體，並執行縮減規模操作。如果叢集負載過重，則 Amazon EMR 會取消移除執行個體並執行縱向擴展操作。

## 節點分配考量
<a name="node-allocation-considerations"></a>

建議您針對核心節點使用隨需購買選項，避免在 Spot 回收時遺失 HDFS 資料。可以針對作業節點使用 Spot 購買選項來降低成本，並在將更多 Spot 執行個體新增至作業節點時獲得更快的作業執行速度。

## 節點配置案例
<a name="node-allocation-scenarios"></a>

透過設定不同組合中的上限、下限、隨需限制以及核心節點參數上限，根據您的需求建立各種擴展案例。

**案例 1：僅擴展核心節點**

若僅擴展核心節點，受管擴展參數必須符合下列要求：
+ 隨需限制等於最大邊界。
+ 最大核心節點等於最大邊界。

如果未指定隨需限制和最大核心節點參數，則兩個參數都會預設為最大邊界。

如果您使用受管擴展搭配節點標籤，並將應用程式程序限制為僅在`CORE`節點上執行，則不適用此案例，因為受管擴展會擴展任務節點以滿足執行器需求。

下列範例僅示範擴展核心節點的案例。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：1 個隨需<br />任務：1 個隨需與 1 個 Spot</td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 20 <br />`MaximumCoreCapacityUnits`: 20</td><td rowspan="2">使用隨需類型，在核心節點上的 1 到 20 個執行個體或執行個體機群單元之間進行擴展。任務節點上沒有擴展。<br />當您使用受管擴展搭配節點標籤，並將應用程式程序限制為`ON_DEMAND`節點時，叢集會使用 或 `Spot`類型，在`CORE`節點上擴展 1 到 20 個執行個體`On-Demand`或執行個體機群單位，視需求類型而定。</td></tr>
  <tr><td>**執行個體機群**<br />核心：1 個隨需<br />任務：1 個隨需與 1 個 Spot</td><td>UnitType: InstanceFleetUnits<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 20 <br />`MaximumCoreCapacityUnits`: 20</td></tr>
</tbody>
</table>


**案例 2：僅擴展任務節點**

若僅擴展任務節點，受管擴展參數必須符合下列要求：
+ 最大核心節點必須等於最小邊界。

下列範例僅示範擴展任務節點的案例。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：2 隨需<br />任務：1 Spot</td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`: 2<br />`MaximumCapacityUnits`: 20<br />`MaximumCoreCapacityUnits`: 2</td><td rowspan="2">將核心節點穩定保持為 2，並且只在 0 到 18 個執行個體或執行個體機群單元之間擴展任務節點。最小與最大界限之間的容量只會新增至任務節點。<br /> 當您使用受管擴展搭配節點標籤，並將應用程式程序限制為 ON\_DEMAND 節點時，叢集會保持核心節點穩定為 2，並根據需求類型，將任務節點擴展到 0 到 18 個使用 `On-demand`或 `Spot`類型的執行個體機群單位。</td></tr>
  <tr><td>**執行個體機群**<br />核心：2 隨需<br />任務：1 Spot</td><td>`UnitType`: InstanceFleetUnits<br />`MinimumCapacityUnits`: 2<br />`MaximumCapacityUnits`: 20<br />`MaximumCoreCapacityUnits`: 2</td></tr>
</tbody>
</table>


**案例 3：僅叢集中的隨需執行個體**

若要僅擁有隨需執行個體，叢集和受管擴展參數必須符合下列要求：
+ 隨需限制等於最大邊界。

  如果未指定隨需限制，參數值會預設為最大邊界。預設值表示 Amazon EMR 僅擴展隨需執行個體。

如果最大核心節點小於最大界限，則可以使用最大核心節點參數來分割核心節點和任務節點之間的容量配置。

若要在由執行個體群組構成的叢集中啟用此案例，叢集中的所有節點群組都必須在初始設定期間使用隨需市場類型。

如果您使用受管擴展搭配節點標籤，並將應用程式程序限制為僅在`ON_DEMAND`節點上執行，則不適用此案例，因為受管擴展會擴展`Spot`節點以滿足執行器需求。

下列範例示範在整個叢集中擁有隨需執行個體的案例。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：1 個隨需<br />任務：1 個隨需 </td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 20 <br />`MaximumCoreCapacityUnits`: 12</td><td rowspan="2">使用隨需類型，在核心節點上的 1 到 12 個執行個體或執行個體機群單元之間進行擴展。使用任務節點上的隨需類型來擴展剩餘容量。不使用 Spot 執行個體進行擴展。<br /> 當您使用受管擴展搭配節點標籤，並將應用程式程序限制為`CORE`節點時，叢集會使用 `ON_DEMAND`類型，在`CORE`節點或`task`節點上擴展 1 到 20 個執行個體或執行個體機群單位，視需求類型而定。在核心節點上擴展不會超過 12 個執行個體或執行個體機群單位。</td></tr>
  <tr><td>**執行個體機群**<br />核心：1 個隨需<br />任務：1 個隨需</td><td>`UnitType`: InstanceFleetUnits<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 20 <br />`MaximumCoreCapacityUnits`: 12</td></tr>
</tbody>
</table>


**案例 4：叢集中只有 Spot 執行個體**

若要僅擁有 Spot 執行個體，受管擴展參數必須符合下列要求：
+ 隨需限制設定為 0。

如果最大核心節點小於最大界限，則可以使用最大核心節點參數來分割核心節點和任務節點之間的容量配置。

若要在由執行個體群組構成的叢集中啟用此案例，核心執行個體群組必須在初始組態設定期間使用 Spot 購買選項。如果任務執行個體群組中沒有 Spot 執行個體，Amazon EMR 受管擴展功能可在需要時使用 Spot 執行個體建立任務群組。

如果您使用受管擴展搭配節點標籤，並將應用程式程序限制為僅在`ON_DEMAND`節點上執行，則不適用此案例，因為受管擴展會擴展`ON_DEMAND`節點以因應應用程式程序需求。

下列範例示範在整個叢集中擁有 Spot 執行個體的案例。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：1 個 Spot<br />任務：1 Spot</td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`：0</td><td rowspan="2">使用 Spot 在核心節點上的 1 到 20 個執行個體或執行個體機群單元之間進行擴展。不使用隨需類型進行擴展。<br />當您使用受管擴展搭配節點標籤，並將應用程式程序限制為`CORE`節點時，叢集會在使用 Spot 的`TASK`節點上擴展 1 到 20 個執行個體`CORE`或執行個體機群單位，視需求類型而定。Amazon EMR 不會使用 `ON_DEMAND`類型擴展。</td></tr>
  <tr><td>**執行個體機群**<br />核心：1 個 Spot<br />任務：1 Spot</td><td>`UnitType`: InstanceFleetUnits<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`：0</td></tr>
</tbody>
</table>


**案例 5：擴展核心節點上的隨需執行個體和任務節點上的 Spot 執行個體**

若要擴展核心節點上的隨需執行個體和任務節點上的 Spot 執行個體，受管擴展參數必須符合下列要求：
+ 隨需限制必須等於最大核心節點。
+ 隨需限制和最大核心節點都必須小於最大界限。

若要在由執行個體群組構成的叢集中啟用此案例，核心節點群組必須使用隨需購買選項。

如果您使用受管擴展搭配節點標籤，並將應用程式程序限制為僅在`ON_DEMAND`節點上執行，則不適用此案例`CORE`。

下列範例示範擴展核心節點上的隨需執行個體和任務節點上的 Spot 執行個體的案例。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：1 個隨需<br />任務：1 個隨需與 1 個 Spot</td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 7 <br />`MaximumCoreCapacityUnits`: 7</td><td rowspan="2">由於任務節點上已有 1 個隨需單元，而隨需的最大限制為 7，因此在核心節點上最多可擴展 6 個隨需單元。然後在任務節點上縱向擴展到 13 個 Spot 單位。</td></tr>
  <tr><td>**執行個體機群**<br />核心：1 個隨需<br />任務：1 個隨需與 1 個 Spot</td><td>`UnitType`: InstanceFleetUnits<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 7<br />`MaximumCoreCapacityUnits`: 7</td></tr>
</tbody>
</table>


**案例 6：擴展`CORE`適用於應用程式程序需求的執行個體，以及適用於執行器需求的`TASK`執行個體。**

只有在您使用受管擴展搭配節點標籤，並將應用程式程序限制為僅在`CORE`節點上執行時，此案例才適用。

若要根據應用程式程序需求擴展`CORE`節點，並根據執行器需求擴展`TASK`節點，您必須在叢集啟動時設定下列組態：
+  `yarn.node-labels.enabled:true` 
+  `yarn.node-labels.am.default-node-label-expression: 'CORE'` 

如果您未指定`ON_DEMAND`限制和最大`CORE`節點參數，這兩個參數都會預設為最大邊界。

如果最大`ON_DEMAND`節點小於最大界限，受管擴展會使用最大`ON_DEMAND`節點參數來分割 `ON_DEMAND`和 `SPOT` 節點之間的容量分配。如果您將最大`CORE`節點參數設定為小於或等於最小容量參數，則`CORE`節點會保持靜態為最大核心容量。

下列範例示範根據應用程式程序需求擴展 CORE 執行個體，以及根據執行器需求擴展 TASK 執行個體的情況。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：1 個隨需<br />任務：1 個隨需</td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`：10<br />`MaximumCoreCapacityUnits`: 20</td><td rowspan="2">使用隨需或 Spot 市場類型，根據叢集的應用程式程序需求，擴展 1 到 20 個節點`CORE`之間的節點。根據執行器需求擴展`TASK`節點，並在 Amazon EMR 配置`CORE`節點後保持可用容量。<br />請求的 `CORE`和 `TASK`節點總和不會超過 20 `maximumCapacity`的 。請求的隨需核心節點和隨需任務節點的總和不會超過 10 `maximumOnDemandCapacity`的 。其他核心或任務節點使用 Spot 市場類型。</td></tr>
  <tr><td>**執行個體機群**<br />核心：1 個隨需<br />任務：1 個隨需</td><td>`UnitType`: InstanceFleetUnits<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`：10<br />`MaximumCoreCapacityUnits`: 20</td></tr>
</tbody>
</table>


**案例 7：擴展`ON_DEMAND`適用於應用程式程序需求的執行個體，以及適用於執行器需求的`SPOT`執行個體。**

只有在您使用受管擴展搭配節點標籤，並將應用程式程序限制為僅在`ON_DEMAND`節點上執行時，此案例才適用。

若要根據應用程式程序需求擴展`ON_DEMAND`節點，並根據執行器需求擴展`SPOT`節點，您必須在叢集啟動時設定下列組態：
+  `yarn.node-labels.enabled:true` 
+  `yarn.node-labels.am.default-node-label-expression: 'ON_DEMAND'` 

如果您未指定`ON_DEMAND`限制和最大`CORE`節點參數，這兩個參數都會預設為最大邊界。

如果最大`CORE`節點小於最大界限，受管擴展會使用最大`CORE`節點參數來分割 `CORE`和 `TASK` 節點之間的容量分配。如果您將最大`CORE`節點參數設定為小於或等於最小容量參數，則`CORE`節點會保持靜態為最大核心容量。

下列範例示範根據應用程式程序需求擴展隨需執行個體，以及根據執行器需求擴展 Spot 執行個體的情況。


<table>
<thead>
  <tr><th>叢集初始狀態</th><th>擴展參數</th><th>擴展行為</th></tr>
</thead>
<tbody>
  <tr><td>**執行個體群組**<br />核心：1 個隨需<br />任務：1 個隨需</td><td>`UnitType`：執行個體<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 20<br />`MaximumCoreCapacityUnits`：10</td><td rowspan="2">根據叢集的應用程式程序需求，使用 `CORE`或 節點類型擴展 1 到 20 個節點`ON_DEMAND`之間的`TASK`節點。根據執行器需求擴展`SPOT`節點，並在 Amazon EMR 配置`ON_DEMAND`節點後保持可用容量。<br />請求的 `ON_DEMAND`和 `SPOT`節點總和不會超過 20 `maximumCapacity`的 。請求的隨需核心節點和 Spot 核心節點總和不會超過 10 `maximumCoreCapacity`的 。其他隨需或 Spot 節點會使用`TASK`節點類型。</td></tr>
  <tr><td>**執行個體機群**<br />核心：1 個隨需<br />任務：1 個隨需</td><td>`UnitType`: InstanceFleetUnits<br />`MinimumCapacityUnits`：1<br />`MaximumCapacityUnits`: 20<br />`MaximumOnDemandCapacityUnits`: 20<br />`MaximumCoreCapacityUnits`：10</td></tr>
</tbody>
</table>
