搭配 Amazon EMR on 的 Spark 運算子使用垂直自動擴展 EKS - Amazon EMR

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

搭配 Amazon EMR on 的 Spark 運算子使用垂直自動擴展 EKS

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

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

必要條件

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

  • 完成「在 上設定 Amazon 的 Spark 運算子 EMR EKS」中的步驟。

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

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

    --set webhook.enable=true
  • 完成「在 EMR上設定 Amazon 的垂直自動擴展 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角色的角色信任政策,並將 serviceaccount 從 更新emr-containers-sa-spark-*-*-xxxxemr-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 Application 規格的驅動程式,以開啟垂直自動擴展:

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

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

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

以下是名為 的範例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.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

如果您的輸出看起來不相似或包含錯誤碼,請參閱 在EKS垂直自動擴展EMR上對 Amazon 進行故障診斷 以取得協助解決問題的步驟。

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

kubectl delete sparkapplication spark-pi