

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

# Amazon EMR on EKS 的 Spark Operator 入门
<a name="spark-operator-gs"></a>

本主题旨在通过部署 Spark 应用程序和 Schedule Spark 应用程序，帮助您开始在 Amazon EKS 上使用 Spark Operator。

## 安装 Spark Operator
<a name="spark-operator-install"></a>

按照以下步骤安装 Apache Spark 版 Kubernetes Operator。

1. 如果尚未执行此操作，请完成 [设置 Amazon EMR on EKS 的 Spark Operator](spark-operator-setup.md) 中的步骤。

1. 向 Amazon ECR 注册表验证您的 Helm 客户端。在以下命令中，将这些*region-id*值替换为您的首选*ECR-registry-account*值 AWS 区域，以及[按区域划分的 Amazon ECR 注册账户](docker-custom-images-tag.md#docker-custom-images-ECR)页面中相应区域的值。

   ```
   aws ecr get-login-password \
   --region region-id | helm registry login \
   --username AWS \
   --password-stdin ECR-registry-account.dkr.ecr.region-id.amazonaws.com
   ```

1. 使用以下命令安装 Spark Operator。

   对于 Helm 图表 `--version` 参数，请使用删除了 `emr-` 前缀和日期后缀的 Amazon EMR 发行版标签。例如，若为 `emr-6.12.0-java17-latest` 发行版，则指定 `6.12.0-java17`。以下命令中的示例使用 `emr-7.12.0-latest` 发行版，因此为 Helm 图表 `--version` 指定了 `7.12.0`。

   ```
   helm install spark-operator-demo \
     oci://895885662937.dkr.ecr.region-id.amazonaws.com/spark-operator \
     --set emrContainers.awsRegion=region-id \
     --version 7.12.0 \
     --namespace spark-operator \
     --create-namespace
   ```

   默认情况下，该命令会为 Spark Operator 创建服务账户 `emr-containers-sa-spark-operator`。若要使用其他服务账户，请提供参数 `serviceAccounts.sparkoperator.name`。例如：

   ```
   --set serviceAccounts.sparkoperator.name my-service-account-for-spark-operator
   ```

   要在 [Spark Operator 中使用垂直自动扩展功能]()，请在安装命令中添加以下行，从而允许 Operator 的 Webhook：

   ```
   --set webhook.enable=true
   ```

1. 使用 `helm list` 命令验证是否安装了 Helm 图表：

   ```
   helm list --namespace spark-operator -o yaml
   ```

   `helm list` 命令应返回最新部署的 Helm 图表的版本信息：

   ```
   app_version: v1beta2-1.3.8-3.1.1
   chart: spark-operator-7.12.0
   name: spark-operator-demo
   namespace: spark-operator
   revision: "1"
   status: deployed
   updated: 2023-03-14 18:20:02.721638196 +0000 UTC
   ```

1. 使用所需的任何其他选项完成安装。有关更多信息，请参阅中的[https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/charts/spark-operator-chart/README.md](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/charts/spark-operator-chart/README.md)文档。 GitHub

## 运行 Spark 应用程序
<a name="spark-operator-run"></a>

Amazon EMR 6.10.0 或更高版本都支持 Spark Operator。安装 Spark Operator 时，默认会创建服务账户 `emr-containers-sa-spark` 来运行 Spark 应用程序。按照下述步骤在 Amazon EMR on EKS 6.10.0 或更高版本上使用 Spark Operator 来运行 Spark 应用程序。

1. 在使用 Spark Operator 运行 Spark 应用程序之前，请先完成 [设置 Amazon EMR on EKS 的 Spark Operator](spark-operator-setup.md) 和 [安装 Spark Operator](#spark-operator-install) 中的步骤。

1. 使用以下示例内容创建 `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-6.10.0:latest"
     imagePullPolicy: Always
     mainClass: org.apache.spark.examples.SparkPi
     mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar"
     sparkVersion: "3.3.1"
     restartPolicy:
       type: Never
     volumes:
       - name: "test-volume"
         hostPath:
           path: "/tmp"
           type: Directory
     driver:
       cores: 1
       coreLimit: "1200m"
       memory: "512m"
       labels:
         version: 3.3.1
       serviceAccount: emr-containers-sa-spark
       volumeMounts:
         - name: "test-volume"
           mountPath: "/tmp"
     executor:
       cores: 1
       instances: 1
       memory: "512m"
       labels:
         version: 3.3.1
       volumeMounts:
         - name: "test-volume"
           mountPath: "/tmp"
   ```

1. 现在，使用以下命令提交 Spark 应用程序。此操作还会创建一个名为 `spark-pi` 的 `SparkApplication` 对象：

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

1. 使用以下命令检查 `SparkApplication` 对象的事件：

   ```
   kubectl describe sparkapplication spark-pi --namespace spark-operator
   ```

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

## 使用 Amazon S3 进行存储
<a name="spark-operator-s3-storage"></a>

要将 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
```

 如果您使用的是 Amazon EMR 7.2.0 及更高版本，则默认包含这些配置。在这种情况下，可以在 Spark 应用程序 YAML 文件中将文件路径设置为 `s3://<bucket_name>/<file_path>`，而不是 `local://<file_path>`。

然后正常提交 Spark 应用程序。