

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

# 搭配使用垂直自動擴展與 Amazon EMR Spark 作業
<a name="jobruns-vas"></a>

Amazon EMR on EKS 垂直自動擴展功能會自動調整記憶體和 CPU 資源，以適應您為 Amazon EMR Spark 應用程式提供的工作負載需求。這可簡化資源管理。

為了追蹤 Amazon EMR Spark 應用程式的即時和歷史資源使用情況，垂直自動擴展功能可利用 Kubernetes [Vertical Pod Autoscaler (VPA)](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler)。垂直自動擴展功能使用 VPA 收集的資料，自動調整指派給 Spark 應用程式的記憶體和 CPU 資源。這種簡化流程可提高可靠性並優化成本。

**Topics**
+ [設定](jobruns-vas-setup.md)
+ [開始使用](jobruns-vas-gs.md)
+ [Configuration](jobruns-vas-configure.md)
+ [監控建議](jobruns-vas-monitor.md)
+ [解除安裝](jobruns-vas-uninstall-operator.md)

# 設定 Amazon EMR on EKS 的垂直自動擴展
<a name="jobruns-vas-setup"></a>

本主題可協助您讓 Amazon EKS 叢集準備好提交具有垂直自動擴展功能的 Amazon EMR Spark 作業。設定程序會要求您確認或完成下列各章節中的任務：

**Topics**
+ [先決條件](#jobruns-vas-prereqs)
+ [在 Amazon EKS 叢集上安裝 Operator Lifecycle Manager (OLM)](#jobruns-vas-install-olm)
+ [安裝 Amazon EMR on EKS 垂直自動擴展運算子](#jobruns-vas-install-operator)

## 先決條件
<a name="jobruns-vas-prereqs"></a>

在叢集上安裝可垂直自動擴展的 Kubernetes Operator 之前，請先完成下列任務。如果已經完成任何先決條件，則可以跳過這些先決條件，然後繼續進行下一個。
+ **[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)**- 如果您已安裝 AWS CLI，請確認您擁有最新版本。
+ **[安裝 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)** – kubectl 是一種命令列工具，可用來與 Kubernetes API 伺服器進行通訊。您需要 kubectl 才能在 Amazon EKS 叢集上安裝和監控垂直自動擴展相關成品。
+ **[安裝 Operator SDK](https://sdk.operatorframework.io/docs/installation/)** – Amazon EMR on EKS 使用 Operator SDK 作為您在叢集上安裝的垂直自動擴展運算子使用壽命的套件管理工具。
+ **[安裝 Docker](https://docs.docker.com/get-docker/)** – 您需要存取 Docker CLI 來驗證和擷取要安裝在 Amazon EKS 叢集上的垂直自動擴展相關 Docker 映像檔。
+ **[安裝 Kubernetes 指標伺服器](https://docs.aws.amazon.com/eks/latest/userguide/metrics-server.html)** – 您必須先安裝指標伺服器，垂直 Pod 自動擴展器才能從 Kubernetes API 伺服器擷取指標。
+ **[開始使用 Amazon EKS – eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) (1.24 版或更新版本）** – Amazon EKS 1.24 版及更高版本支援垂直自動擴展。建立叢集後，[請進行註冊以與 Amazon EMR 搭配使用](setting-up-registration.md)。
+ **[選擇 Amazon EMR 基礎映像 URI](docker-custom-images-tag.md) (6.10.0 版或更高版本)** - Amazon EMR 6.10.0 版及更高版本支援垂直自動擴展。

## 在 Amazon EKS 叢集上安裝 Operator Lifecycle Manager (OLM)
<a name="jobruns-vas-install-olm"></a>

使用 Operator SDK CLI 在想要設定垂直自動擴展的 Amazon EMR on EKS 叢集上安裝 Operator Lifecycle Manager (OLM)，如下列範例所示。設定完成後，可以使用 OLM 來安裝和管理 [Amazon EMR 垂直自動擴展運算子的生命週期](#jobruns-vas-install-operator)。

```
operator-sdk olm install
```

若要驗證安裝，請執行 `olm status` 命令：

```
operator-sdk olm status
```

請確認命令傳回成功結果，與以下範例輸出類似：

```
INFO[0007] Successfully got OLM status for version X.XX
```

如果安裝未成功，請參閱 [對 Amazon EMR on EKS 垂直自動擴展進行疑難排解](troubleshooting-vas.md)。

## 安裝 Amazon EMR on EKS 垂直自動擴展運算子
<a name="jobruns-vas-install-operator"></a>

使用下列步驟在 Amazon EKS 叢集上安裝垂直自動擴展運算子：

1. 設定下列將用於完成安裝的環境變數：
   + **`$REGION`** 指向叢集的 AWS 區域 。例如 `us-west-2`。
   + **`$ACCOUNT_ID`** 指向您所在區域的 Amazon ECR 帳戶 ID。如需詳細資訊，請參閱[按區域劃分的 Amazon ECR 登錄檔帳戶](docker-custom-images-tag.md#docker-custom-images-ECR)。
   + **`$RELEASE`** 指向要用於叢集的 Amazon EMR 版本。對於垂直自動擴展，必須使用 Amazon EMR 6.10.0 或更高版本。

1. 接下來，取得運算子的 [Amazon ECR 登錄檔](docker-custom-images-tag.md#docker-custom-images-ECR)驗證字符。

   ```
   aws ecr get-login-password \
    --region region-id | docker login \
    --username AWS \
    --password-stdin $ACCOUNT_ID.dkr.ecr.region-id.amazonaws.com
   ```

1. 使用下列命令安裝 Amazon EMR on EKS 垂直自動擴展運算子：

   ```
   ECR_URL=$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com && \
   REPO_DEST=dynamic-sizing-k8s-operator-olm-bundle && \
   BUNDLE_IMG=emr-$RELEASE-dynamic-sizing-k8s-operator && \
   operator-sdk run bundle \
   $ECR_URL/$REPO_DEST/$BUNDLE_IMG\:latest
   ```

   這會在 Amazon EKS 叢集的預設命名空間中建立垂直自動擴展運算子的版本。使用此命令在不同的命名空間中安裝：

   ```
   operator-sdk run bundle \
   $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/dynamic-sizing-k8s-operator-olm-bundle/emr-$RELEASE-dynamic-sizing-k8s-operator:latest \
   -n operator-namespace
   ```
**注意**  
如果指定的命名空間不存在，則 OLM 將不會安裝運算子。如需詳細資訊，請參閱[找不到 Kubernetes 命名空間](troubleshooting-vas.md)。

1. 確認已使用 kubectl Kubernetes 命令列工具成功安裝 Operator。

   ```
   kubectl get csv -n operator-namespace
   ```

   `kubectl` 命令應傳回新部署的垂直自動擴展器 Operator，其**階段**狀態為**已成功**。如果遇到安裝或設定問題，請參閱 [對 Amazon EMR on EKS 垂直自動擴展進行疑難排解](troubleshooting-vas.md)。

# Amazon EMR on EKS 垂直自動擴展入門
<a name="jobruns-vas-gs"></a>

如果您想要自動調校記憶體和 CPU 資源以適應 Amazon EMR Spark 應用程式工作負載，請使用 Amazon EMR on EKS 的垂直自動調整規模。如需詳細資訊，請參閱[搭配 Amazon EMR Spark 任務使用垂直自動擴展](jobruns-vas.html)。

## 使用垂直自動擴展功能提交 Spark 作業
<a name="jobruns-vas-spark-submit"></a>

透過 [StartJobRun](https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_StartJobRun.html) API 提交作業時，請將下列兩個組態新增至驅動程式，以便 Spark 作業開啟垂直自動擴展：

```
"spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing":"true",
"spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.signature":"YOUR_JOB_SIGNATURE"
```

在上面的代碼中，第一列啟用垂直自動擴展功能。下一列是必要的簽章組態，可讓您為作業選擇簽章。

如需這些組態和可接受參數值的詳細資訊，請參閱 [設定 Amazon EMR on EKS 的垂直自動擴展](jobruns-vas-configure.md)。依預設，您的作業在垂直自動擴展的僅監控**關閉**模式下提交。此監控狀態可讓您計算和檢視資源建議，而無需執行自動擴展。如需詳細資訊，請參閱[垂直自動擴展模式](jobruns-vas-configure.md#jobruns-vas-parameters-opt-mode)。

以下範例示範如何使用垂直自動擴展來完成範例 `start-job-run` 命令：

```
aws emr-containers start-job-run \
--virtual-cluster-id $VIRTUAL_CLUSTER_ID \
--name $JOB_NAME \
--execution-role-arn $EMR_ROLE_ARN \
--release-label emr-6.10.0-latest \
--job-driver '{
  "sparkSubmitJobDriver": {
     "entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py"
   }
 }' \
--configuration-overrides '{
    "applicationConfiguration": [{
        "classification": "spark-defaults",
        "properties": {
          "spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing": "true",
          "spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.signature": "test-signature"
        }
    }]
  }'
```

## 驗證垂直自動擴展功能
<a name="jobruns-vas-verify"></a>

若要確認垂直自動擴展適用於已提交的作業，請使用 kubectl 取得 `verticalpodautoscaler` 自訂資源並檢視您的擴展建議。例如，下列命令會查詢 [使用垂直自動擴展功能提交 Spark 作業](#jobruns-vas-spark-submit) 區段中範例作業的建議：

```
kubectl get verticalpodautoscalers --all-namespaces \
-l=emr-containers.amazonaws.com/dynamic.sizing.signature=test-signature
```

此查詢的輸出應如下所示：

```
NAME                                                          MODE   CPU         MEM PROVIDED   AGE
ds-jceyefkxnhrvdzw6djum3naf2abm6o63a6dvjkkedqtkhlrf25eq-vpa   Off    3304504865  True           87m
```

如果您的輸出看起來不相似或包含錯誤碼，請參閱 [對 Amazon EMR on EKS 垂直自動擴展進行疑難排解](troubleshooting-vas.md) 以取得協助解決問題的步驟。

# 設定 Amazon EMR on EKS 的垂直自動擴展
<a name="jobruns-vas-configure"></a>

當您透過 [StartJobRun](https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_StartJobRun.html) API 提交 Amazon EMR Spark 作業時，可設定垂直自動擴展。在 Spark 驅動程式 Pod 中設定自動擴展相關組態參數，如 [使用垂直自動擴展功能提交 Spark 作業](jobruns-vas-gs.md#jobruns-vas-spark-submit) 中的範例所示。

Amazon EMR on EKS 垂直自動擴展 Operator 會偵聽具有自動擴展功能的驅動程式 Pod，然後透過驅動程式 Pod 中的設定進行與 Kubernetes Vertical Pod Autoscaler (VPA) 的整合。這有助於 Spark 執行程式 Pod 的資源追蹤和自動擴展。

以下各章節描述了為 Amazon EKS 叢集設定垂直自動擴展時可以使用的參數。

**注意**  
將功能切換參數設定為標籤，並將其餘參數設定為 Spark 驅動程式 Pod 中的註釋。自動擴展參數屬於 `emr-containers.amazonaws.com/` 域，並具有 `dynamic.sizing` 字首。

## 必要參數
<a name="jobruns-vas-parameters-req"></a>

提交作業時，必須在 Spark 作業驅動程式中包含下列兩個參數：


| 金錀 | Description | 接受的值 | 預設值 | Type | Spark 參數1 | 
| --- | --- | --- | --- | --- | --- | 
|  `dynamic.sizing`  |  功能切換  |  `true`, `false`  |  未設定  |  label  |  `spark.kubernetes.driver.label.emr-containers.amazonaws.com/dynamic.sizing`  | 
|  `dynamic.sizing.signature`  |  作業簽章  |  *string*  |  未設定  |  註釋  |  `spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.signature`  | 

1 `ConfigurationOverride` 在 `StartJobRun` API 中使用此參數作為 `SparkSubmitParameter` 或 。
+ **`dynamic.sizing`** - 可以使用 `dynamic.sizing` 標籤開啟和關閉垂直自動擴展功能。若要開啟垂直自動擴展，請在 Spark 驅動程式 Pod 中將 `dynamic.sizing` 設定為 `true`。如果省略此標籤或將其設定為除 `true` 以外的任何值，垂直自動擴展功能會關閉。
+ **`dynamic.sizing.signature`** - 在驅動程式 Pod 中設定含有 `dynamic.sizing.signature` 注釋的作業簽章。垂直自動擴展可跨 Amazon EMR Spark 作業的不同執行來彙總資源使用量資料，以衍生資源建議。您可以提供唯一識別符，以便將作業繫結在一起。

  
**注意**  
如果作業以固定間隔 (例如每日或每週) 重複出現，則作業簽章對於作業的每個新執行個體都應保持不變。這可確保垂直自動擴展功能可以計算和彙總作業的不同執行中的建議。

1 `ConfigurationOverride` 在 `StartJobRun` API 中使用此參數作為 `SparkSubmitParameter` 或 。

## 選用的參數
<a name="jobruns-vas-parameters-opt"></a>

垂直自動擴展也支援下列選用參數。將它們設定為驅動程式 Pod 中的注釋。


| 金錀 | Description | 接受的值 | 預設值 | Type | Spark 參數1 | 
| --- | --- | --- | --- | --- | --- | 
|  `dynamic.sizing.mode`  |  垂直自動擴展模式  |  `Off`, `Initial`, `Auto`  |  `Off`  |  註釋  |  `spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.mode`  | 
|  `dynamic.sizing.scale.memory`  |  啟用記憶體擴展  |  *`true`, `false`*  |  `true`  |  註釋  |  `spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.scale.memory`  | 
|  `dynamic.sizing.scale.cpu`  |  開啟或關閉 CPU 擴展  |  *`true`, `false`*  |  `false`  |  註釋  |  `spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.scale.cpu`  | 
|  `dynamic.sizing.scale.memory.min`  |  記憶體擴展的下限  | 字串，[K8s 資源數量](https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity)例如：1G |  未設定  |  註釋  | spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.scale.memory.min | 
|  `dynamic.sizing.scale.memory.max`  |  記憶體擴展的上限  | 字串，[K8s 資源數量](https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity)例如：4G |  未設定  |  註釋  | spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.scale.memory.max | 
|  `dynamic.sizing.scale.cpu.min`  |  CPU 擴展的下限  | 字串，[K8s 資源數量](https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity)例如：1 |  未設定  |  註釋  | spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.scale.cpu.min | 
|  `dynamic.sizing.scale.cpu.max`  |  CPU 擴展的上限  | 字串，[K8s 資源數量](https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity)例如：2 |  未設定  |  註釋  | spark.kubernetes.driver.annotation.emr-containers.amazonaws.com/dynamic.sizing.scale.cpu.max | 

### 垂直自動擴展模式
<a name="jobruns-vas-parameters-opt-mode"></a>

`mode` 參數會映射至 VPA 支援的不同自動擴展模式。使用驅動程式 Pod 上的 `dynamic.sizing.mode` 註釋來設定模式。此參數支援下列值：
+ **關閉** – 試轉模式，您可以在該模式中監控建議，但不會執行自動擴展。這是垂直自動擴展的預設模式。在此模式中，相關聯的垂直 Pod 自動擴展器資源會計算建議，您可以透過 kubectl、Prometheus 和 Grafana 等工具監控建議。
+ **初始** - 在此模式中，如果根據作業的歷史執行 (例如週期性作業) 提供建議，則 VPA 會在作業開始時自動擴展資源。
+ **自動** - 在此模式中，VPA 會移出 Spark 執行程式 Pod，並在 Spark 驅動程式 Pod 重新啟動它們時，使用建議的資源設定來自動擴展它們。有時，VPA 會移出執行中的 Spark 執行程式 Pod，因此當它重試中斷的執行程式時，可能會導致額外的延遲。

### 資源擴展
<a name="jobruns-vas-parameters-opt-rs"></a>

當您設定垂直自動擴展時，可選擇是否擴展 CPU 和記憶體資源。將 `dynamic.sizing.scale.cpu` 和 `dynamic.sizing.scale.memory` 註釋設定為 `true` 或 `false`。根據預設，CPU 擴展設定為 `false`，記憶體擴展設定為 `true`。

### 資源最小值和最大值 (邊界)
<a name="jobruns-vas-parameters-opt-bounds"></a>

或者，也可以在 CPU 和記憶體資源上設定邊界。啟用自動擴展時，請為這些具有 `dynamic.sizing.[memory/cpu].[min/max]` 註釋的資源選擇最小值和最大值。根據預設，資源沒有限制。將註釋設定為代表 Kubernetes 資源數量的字串值。例如，將 `dynamic.sizing.memory.max` 設定為 `4G`，表示 4 GB。

# 監控 Amazon EMR on EKS 的垂直自動擴展
<a name="jobruns-vas-monitor"></a>

您可以使用 **kubectl** Kubernetes 命令列工具，列出叢集上作用中的垂直自動擴展相關建議。也可以檢視追蹤的作業簽章，並清除與簽章相關聯的任何不需要的資源。



## 列出叢集的垂直自動擴展建議
<a name="jobruns-vas-monitor-list"></a>

使用 kubectl 取得 `verticalpodautoscaler` 資源，並檢視目前的狀態和建議。下列範例查詢會傳回 Amazon EKS 叢集中的所有作用中資源。

```
kubectl get verticalpodautoscalers \
-o custom-columns="NAME:.metadata.name,"\
"SIGNATURE:.metadata.labels.emr-containers\.amazonaws\.com/dynamic\.sizing\.signature,"\
"MODE:.spec.updatePolicy.updateMode,"\
"MEM:.status.recommendation.containerRecommendations[0].target.memory" \
--all-namespaces
```

此查詢的輸出如下所示：

```
NAME                  SIGNATURE                MODE      MEM
ds-example-id-1-vpa   job-signature-1          Off       none
ds-example-id-2-vpa   job-signature-2          Initial   12936384283
```

## 查詢並刪除叢集的垂直自動擴展建議
<a name="jobruns-vas-monitor-query"></a>

刪除 Amazon EMR 垂直自動擴展作業執行資源時，它會自動刪除追蹤並儲存建議的關聯 VPA 物件。

下列範例使用 kubectl 來清除由簽章識別之作業的建議：

```
kubectl delete jobrun -n emr -l=emr-containers\.amazonaws\.com/dynamic\.sizing\.signature=integ-test
jobrun.dynamicsizing.emr.services.k8s.aws "ds-job-signature" deleted
```

如果您不知道特定作業簽章，或想要清除叢集中的所有資源，則可以在命令中使用 `--all` 或 `--all-namespaces`，而非唯一的作業 ID，如下列範例所示：

```
kubectl delete jobruns --all --all-namespaces
jobrun.dynamicsizing.emr.services.k8s.aws "ds-example-id" deleted
```

# 解除安裝 Amazon EMR on EKS 垂直自動擴展 Operator
<a name="jobruns-vas-uninstall-operator"></a>

如果想要從 Amazon EKS 叢集中移除垂直自動擴展 Operator，請搭配使用 `cleanup` 命令與 Operator SDK CLI，如以下範例所示。這也會刪除與 Operator 一起搭配安裝的上游相依性，例如 Vertical Pod Autoscaler。

```
operator-sdk cleanup emr-dynamic-sizing
```

刪除 Operator 時，如果叢集中有任何正在執行的作業，則這些作業會繼續執行，而不會進行垂直自動擴展。如果在刪除 Operator 後在叢集中提交作業，則 Amazon EMR on EKS 將忽略您在[設定](jobruns-vas-configure.md)期間定義的任何垂直自動擴展相關參數。