

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

# 開始針對 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>

請使用下列步驟來安裝 Kubernetes Operator for Apache Spark。

1. 如果您尚未這麼做，請完成 [為 Amazon EMR on EKS 設定 Spark Operator](spark-operator-setup.md) 中的步驟。

1. 向 Amazon ECR 登錄檔驗證 Helm 用戶端。在下列命令中，將 *region-id* 值取代為您偏好的 AWS 區域，以及 [按區域劃分的 Amazon ECR 登錄檔帳戶](docker-custom-images-tag.md#docker-custom-images-ECR) 頁面中區域的對應 *ECR-registry-account* 值。

   ```
   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 Chart `--version` 參數，請使用移除了 `emr-` 字首和日期尾碼的 Amazon EMR 版本標籤。例如，對於 `emr-6.12.0-java17-latest` 發行版本，請指定 `6.12.0-java17`。下列命令中的範例使用 `emr-7.12.0-latest` 版本，因此它會為 Helm Chart `--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 Chart：

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

   `helm list` 命令應傳回新部署的 Helm Chart 版本資訊：

   ```
   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. 使用您需要的任何其他選項完成安裝。如需詳細資訊，請參閱 GitHub 上的 [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) 文件。

## 執行 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 Operator 將應用程式提交至 Spark 的詳細資訊，請參閱 GitHub 上 `spark-on-k8s-operator` 文件中的[使用 `SparkApplication`](https://www.kubeflow.org/docs/components/spark-operator/user-guide/using-sparkapplication/)。

## 使用 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 版和更新版本，預設會包含組態。在這種情況下，您可以將檔案路徑設定為 ，`s3://<bucket_name>/<file_path>`而不是`local://<file_path>`在 Spark 應用程式 YAML 檔案中。

然後正常提交 Spark 應用程式。