将 Amazon EMR on EKS 垂直自动扩展功能与 Spark Operator 结合使用 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Amazon EMR on EKS 垂直自动扩展功能与 Spark Operator 结合使用

从 Amazon EMR 7.0 开始,您可以在 EKS 垂直自动扩展上使用 Amazon EMR 来简化资源管理。该功能会自动调整内存和 CPU 资源,从而适应您为 Amazon EMR Spark 应用程序提供的工作负载需求。有关更多信息,请参阅 使用垂直自动扩展功能处理 Amazon EMR Spark 任务

本节将介绍如何将 Spark Operator 配置为使用垂直自动扩展功能。

先决条件

请务必完成以下设置后再开始操作:

  • 完成设置 Amazon EMR on EKS 的 Spark Operator中的步骤。

  • (可选)如果您之前安装了旧版本的 Spark 运算符,请删除 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 位置中的文件:

    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 应用程序规范的驱动程序中添加以下配置,以开启垂直自动缩放:

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

此配置支持垂直自动缩放,并且是允许您为作业选择签名的必需签名配置。

有关配置和参数值的更多信息,请参阅在 EKS 上为 A mazon EMR 配置垂直自动扩展。默认情况下,任务在垂直自动扩展的仅限监控关闭模式下提交。这种监控状态可让您在不执行自动扩展的情况下计算并查看资源建议。有关更多信息,请参阅垂直自动缩放模式

以下是一个名为的示例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.1.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 垂直自动扩展进行问题排查,了解有助于解决问题的操作步骤。

要移除 pod 和应用程序,请运行以下命令:

kubectl delete sparkapplication spark-pi