

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对 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 步中，在安装命令中添加以下行，以允许运算符的 Webhook：

  ```
  --set webhook.enable=true
  ```
+ 完成 [设置 Amazon EMR on EKS 的垂直自动扩展](jobruns-vas-setup.md) 中的步骤。
+ 允许访问 Amazon S3 位置中的文件：

  1. 使用具有 S3 权限的 `JobExecutionRole` 为驱动程序和 Operator 服务账户添加注释。

     ```
     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-vas-prereqs) 中的步骤，然后才能使用 Spark Operator 运行 Spark 应用程序。

要在 Spark Operator 中使用垂直自动扩缩功能，请在 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)。

下面是一个名为 `spark-pi.yaml` 的 `SparkApplication` 定义文件示例，其中包含使用垂直自动扩缩功能所需的配置。

```
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 运算符向 Spark 提交应用程序的更多信息，请参阅`spark-on-k8s-operator`文档`SparkApplication`中的[使用](https://www.kubeflow.org/docs/components/spark-operator/user-guide/using-sparkapplication/) GitHub。

## 验证垂直自动扩展功能
<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
```