在 Amazon EMR 上與 Spark 運營商一起使用垂直自動調度 EKS - Amazon EMR

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

在 Amazon EMR 上與 Spark 運營商一起使用垂直自動調度 EKS

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

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

必要條件

繼續之前,請先完成下列設定:

  • 完成「建立 Amazon EMR 的星火運營商 EKS」中的步驟。

  • (選擇性) 如果您先前安裝了較舊版本的 Spark 運算子,請刪除 SparkApplication/ScheduledSparkApplication CRD。

    kubectl delete crd sparkApplication kubectl delete crd scheduledSparkApplication
  • 完成「安裝 Spark Operator」中的步驟。在步驟 3 中,將以下命令列新增至安裝命令,以允許該 Operator 使用 Webhook:

    --set webhook.enable=true
  • 完成「設定 Amazon EMR on EKS 的垂直自動擴展」中的步驟。

  • 授予您 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
    2. 更新該命名空間中工作執行角色的信任原則。

      aws emr-containers update-role-trust-policy \ --cluster-name cluster \ --namespace ${Namespace}\ --role-name iam_role_name_for_job_execution
    3. 編輯工作執行IAM角色的角色信任原則,並emr-containers-sa-spark-*-*-xxxxserviceaccount從更新為emr-containers-sa-*

      { "Effect": "Allow", "Principal": { "Federated": "OIDC-provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringLike": { "OIDC": "system:serviceaccount:${Namespace}:emr-containers-sa-*" } } }
    4. 如果您使用 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 上使用垂直自動擴展來執行作業

在使用 Spark Operator 執行 Spark 應用程式之前,必須先完成 必要條件 中的步驟。

若要搭配 Spark 運算子使用垂直自動調度資源,請將下列組態新增至您的 Spark 應用程式規格的驅動程式,以開啟垂直自動調度資源:

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

此組態可啟用垂直自動調度資源,而且是必要的簽名組態,可讓您為工作選擇簽名。

如需有關組態和參數值的詳細資訊,請參閱在EMR上EKS設定 Amazon 的垂直自動調度資源。依預設,您的作業在垂直自動擴展的僅監控關閉模式下提交。此監控狀態可讓您計算和檢視資源建議,而無需執行自動擴展。如需詳細資訊,請參閱垂直自動調度資源模式

以下是使用垂直自動調度資源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.2.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-piSparkApplication 物件:

kubectl apply -f spark-pi.yaml

如需有關透過 Spark 運算子提交應用程式至 Spark 的詳細資訊,請參閱上的spark-on-k8s-operator文件SparkApplication中的使用 GitHub.

驗證垂直自動擴展功能

若要確認垂直自動擴展適用於已提交的作業,請使用 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 垂直自動擴展進行疑難排解 以取得協助解決問題的步驟。

若要移除網繭和應用程式,請執行下列命令:

kubectl delete sparkapplication spark-pi