本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
搭配 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 位置中的檔案:
-
使用具有 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
-
更新該命名空間中任務執行角色的信任政策。
aws emr-containers update-role-trust-policy \ --cluster-name cluster \ --namespace ${Namespace}\ --role-name iam_role_name_for_job_execution
-
編輯任務執行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-*" } } } -
如果您使用 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-pi
的 SparkApplication
物件:
kubectl apply -f spark-pi.yaml
如需透過 Spark 運算子將應用程式提交至 Spark 的詳細資訊,請參閱 上的spark-on-k8s-operator
文件中的使用 SparkApplication
驗證垂直自動擴展功能
若要確認垂直自動擴展適用於已提交的作業,請使用 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