对 Amazon EMR on EKS 的 Spark Operator 使用垂直自动扩缩功能
从 Amazon EMR 7.0 开始,您可以使用 Amazon EMR on EKS 垂直自动扩缩功能以简化资源管理。该功能会自动调整内存和 CPU 资源,从而适应您为 Amazon EMR Spark 应用程序提供的工作负载需求。有关更多信息,请参阅 使用垂直自动扩展功能处理 Amazon EMR Spark 任务。
本节将介绍如何将 Spark Operator 配置为使用垂直自动扩展功能。
先决条件
请务必完成以下设置后再开始操作:
-
(可选)如果之前安装的是旧版 Spark Operator,请删除 SparkApplication/ScheduledSparkApplication CRD。
kubectl delete crd sparkApplication kubectl delete crd scheduledSparkApplication
-
完成安装 Spark Operator中的步骤。在第 3 步中,在安装命令中添加以下行,以允许运算符的 Webhook:
--set webhook.enable=true
-
完成设置 Amazon EMR on EKS 的垂直自动扩展中的步骤。
-
允许访问 Amazon S3 位置中的文件:
-
使用具有 S3 权限的
JobExecutionRole
为驱动程序和 Operator 服务账户添加注释。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 Operator 中使用垂直自动扩缩功能,请在 Spark 应用程序规范的驱动程序中添加以下配置,以打开垂直自动扩缩功能:
dynamicSizing: mode: Off signature: "my-signature"
此配置支持垂直自动扩缩,也是必需的签名配置,允许您为作业选择签名。
有关配置和参数值的更多信息,请参阅配置 Amazon EMR on EKS 的自动扩缩。默认情况下,任务在垂直自动扩展的仅限监控关闭模式下提交。这种监控状态可让您在不执行自动扩展的情况下计算并查看资源建议。有关更多信息,请参阅垂直自动扩缩模式。
下面是一个名为 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.3.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 Operator 向 Spark 提交应用程序的更多信息,请在 GitHub 上参阅 spark-on-k8s-operator
文档中的 Using a 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 垂直自动扩展进行问题排查,了解有助于解决问题的操作步骤。
要删除容器组(pod)和应用程序,请运行以下命令:
kubectl delete sparkapplication spark-pi