本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 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 位置中檔案的存取權限:
-
使用具有 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角色的角色信任原則,並
emr-containers-sa-spark-*-*-xxxx
將serviceaccount
從更新為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 應用程式規格的驅動程式,以開啟垂直自動調度資源:
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-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
如果您的輸出看起來不相似或包含錯誤碼,請參閱 對 Amazon EMR on EKS 垂直自動擴展進行疑難排解 以取得協助解決問題的步驟。
若要移除網繭和應用程式,請執行下列命令:
kubectl delete sparkapplication spark-pi