

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

# 搭配適用於 Amazon EMR on EKS 的 Spark Operator 使用垂直自動擴展
<a name="spark-operator-vas"></a>

從 Amazon EMR 7.0 開始，您可以使用 Amazon EMR on EKS 垂直自動擴展來簡化資源管理。它會自動調整記憶體和 CPU 資源，以適應您為 Amazon EMR Spark 應用程式提供的工作負載需求。如需詳細資訊，請參閱[搭配使用垂直自動擴展與 Amazon EMR Spark 作業](jobruns-vas.md)。

本章節描述了如何設定 Spark Operator 以使用垂直自動擴展。

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

設定監控之前，請務必完成下列設定任務：
+ 完成「[為 Amazon EMR on EKS 設定 Spark Operator](spark-operator-setup.md)」中的步驟。
+ （選用） 如果您先前已安裝較舊版本的 Spark 運算子，請刪除 SparkApplication/ScheduledSparkApplication CRD。

  ```
  kubectl delete crd sparkApplication
  kubectl delete crd scheduledSparkApplication
  ```
+ 完成「[安裝 Spark Operator](spark-operator-gs.md#spark-operator-install)」中的步驟。在步驟 3 中，將以下命令列新增至安裝命令，以允許該 Operator 使用 Webhook：

  ```
  --set webhook.enable=true
  ```
+ 完成「[設定 Amazon EMR on EKS 的垂直自動擴展](jobruns-vas-setup.md)」中的步驟。
+ 允許存取 Amazon S3 位置中的檔案：

  1. 使用具有 S3 許可`JobExecutionRole`的 標註您的驅動程式和運算子服務帳戶。

     ```
     kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark eks.amazonaws.com/role-arn=JobExecutionRole
     kubectl annotate serviceaccount -n spark-operator emr-containers-sa-spark-operator eks.amazonaws.com/role-arn=JobExecutionRole
     ```

  1. 更新該命名空間中任務執行角色的信任政策。

     ```
     aws emr-containers update-role-trust-policy \
     --cluster-name cluster \
     --namespace ${Namespace}\
     --role-name iam_role_name_for_job_execution
     ```

  1. 編輯任務執行角色的 IAM 角色信任政策，並將 `serviceaccount` 從 更新`emr-containers-sa-spark-*-*-xxxx`為 `emr-containers-sa-*`。

     ```
     {
         "Effect": "Allow",
         "Principal": {
             "Federated": "OIDC-provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
             "StringLike": {
                 "OIDC": "system:serviceaccount:${Namespace}:emr-containers-sa-*"
             }
         }
     }
     ```

  1. 如果您使用 Amazon S3 做為檔案儲存體，請將下列預設值新增至 yaml 檔案。

     ```
     hadoopConf:
     # EMRFS filesystem
       fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider
       fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem
       fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate
       fs.s3.buffer.dir: /mnt/s3
       fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000"
       mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2"
       mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true"
     sparkConf:
      # Required for EMR Runtime
      spark.driver.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*
      spark.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native
      spark.executor.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*
      spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native
     ```

## 在 Spark Operator 上使用垂直自動擴展來執行作業
<a name="spark-operator-vas-run"></a>

在使用 Spark Operator 執行 Spark 應用程式之前，必須先完成 [先決條件](#spark-operator-vas-prereqs) 中的步驟。

若要搭配 Spark 運算子使用垂直自動調整規模，請將下列組態新增至 Spark 應用程式規格的驅動程式，以開啟垂直自動調整規模：

```
dynamicSizing:
  mode: Off
  signature: "my-signature"
```

此組態會啟用垂直自動擴展，並且是必要的簽章組態，可讓您為任務選擇簽章。

如需組態和參數值的詳細資訊，請參閱[設定 Amazon EMR on EKS 的垂直自動調整規模](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/jobruns-vas-configure.html)。依預設，您的作業在垂直自動擴展的僅監控**關閉**模式下提交。此監控狀態可讓您計算和檢視資源建議，而無需執行自動擴展。如需詳細資訊，請參閱[垂直自動調整規模模式](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/jobruns-vas-configure.html#jobruns-vas-parameters-opt-mode)。

以下是名為 的範例`SparkApplication`定義檔案，`spark-pi.yaml`其中包含使用垂直自動擴展所需的組態。

```
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: spark-operator
spec:
  type: Scala
  mode: cluster
  image: "895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-7.12.0:latest"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar"
  sparkVersion: "3.4.1"
  dynamicSizing:
    mode: Off
    signature: "my-signature"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1200m"
    memory: "512m"
    labels:
      version: 3.4.1
    serviceAccount: emr-containers-sa-spark
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 3.4.1
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
```

現在，使用下列命令提交 Spark 應用程式。這也將建立名為 `spark-pi` 的 `SparkApplication` 物件：

```
kubectl apply -f spark-pi.yaml
```

如需有關透過 Spark Operator 將應用程式提交至 Spark 的詳細資訊，請參閱 GitHub 上 `spark-on-k8s-operator` 文件中的[使用 `SparkApplication`](https://www.kubeflow.org/docs/components/spark-operator/user-guide/using-sparkapplication/)。

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

若要確認垂直自動擴展適用於已提交的作業，請使用 kubectl 取得 `verticalpodautoscaler` 自訂資源並檢視您的擴展建議。

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

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

```
NAMESPACE        NAME                                                          MODE   CPU   MEM         PROVIDED   AGE
spark-operator   ds-p73j6mkosvc4xeb3gr7x4xol2bfcw5evqimzqojrlysvj3giozuq-vpa   Off          580026651   True       15m
```

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

若要移除 Pod 和應用程式，請執行下列命令：

```
kubectl delete sparkapplication spark-pi
```