开始使用适用于 Amaz EMR on 的 Spark 运营商 EKS - Amazon EMR

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

开始使用适用于 Amaz EMR on 的 Spark 运营商 EKS

本主题EKS通过部署 Spark 应用程序和计划 Spark 应用程序,帮助您开始在亚马逊上使用 Spark 运算符。

安装 Spark Operator

按照以下步骤安装 Apache Spark 版 Kubernetes Operator。

  1. 如果尚未执行此操作,请完成 在上为亚马逊EMR设置 Spark 运算符 EKS 中的步骤。

  2. 向 Amazon ECR 注册表对您的 Helm 客户端进行身份验证。在以下命令中,替换 region-id 您偏好的值 AWS 区域,以及相应的 ECR-registry-account 按地区划分的亚马逊ECR注册账户页面中该区域的值。

    aws ecr get-login-password \ --region region-id | helm registry login \ --username AWS \ --password-stdin ECR-registry-account.dkr.ecr.region-id.amazonaws.com
  3. 使用以下命令安装 Spark Operator。

    对于 Helm char --version t 参数,请使用删除emr-前缀和日期后缀的 Amazon EMR 版本标签。例如,若为 emr-6.12.0-java17-latest 发行版,则指定 6.12.0-java17。以下命令中的示例使用 emr-7.2.0-latest 发行版,因此为 Helm 图表 --version 指定了 7.2.0

    helm install spark-operator-demo \ oci://895885662937.dkr.ecr.region-id.amazonaws.com/spark-operator \ --set emrContainers.awsRegion=region-id \ --version 7.2.0 \ --namespace spark-operator \ --create-namespace

    默认情况下,该命令会为 Spark Operator 创建服务账户 emr-containers-sa-spark-operator。若要使用其他服务账户,请提供参数 serviceAccounts.sparkoperator.name。例如:

    --set serviceAccounts.sparkoperator.name my-service-account-for-spark-operator

    要在 Spark Operator 中使用垂直自动扩展功能,请在安装命令中添加以下行,从而允许 Operator 的 Webhook:

    --set webhook.enable=true
  4. 使用 helm list 命令验证是否安装了 Helm 图表:

    helm list --namespace spark-operator -o yaml

    helm list 命令应返回最新部署的 Helm 图表的版本信息:

    app_version: v1beta2-1.3.8-3.1.1 chart: spark-operator-7.2.0 name: spark-operator-demo namespace: spark-operator revision: "1" status: deployed updated: 2023-03-14 18:20:02.721638196 +0000 UTC
  5. 使用所需的任何其他选项完成安装。有关更多信息,请参阅中的spark-on-k8s-operator文档。 GitHub

运行 Spark 应用程序

亚马逊 EMR 6.10.0 或更高版本支持 Spark 运算符。安装 Spark Operator 时,默认会创建服务账户 emr-containers-sa-spark 来运行 Spark 应用程序。使用以下步骤在亚马逊 EMR EKS 6.10.0 或更高版本上使用 Spark 操作员运行 Spark 应用程序。

  1. 在使用 Spark Operator 运行 Spark 应用程序之前,请先完成 在上为亚马逊EMR设置 Spark 运算符 EKS安装 Spark Operator 中的步骤。

  2. 使用以下示例内容创建 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-6.10.0:latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples.jar" sparkVersion: "3.3.1" restartPolicy: type: Never volumes: - name: "test-volume" hostPath: path: "/tmp" type: Directory driver: cores: 1 coreLimit: "1200m" memory: "512m" labels: version: 3.3.1 serviceAccount: emr-containers-sa-spark volumeMounts: - name: "test-volume" mountPath: "/tmp" executor: cores: 1 instances: 1 memory: "512m" labels: version: 3.3.1 volumeMounts: - name: "test-volume" mountPath: "/tmp"
  3. 现在,使用以下命令提交 Spark 应用程序。此操作还会创建一个名为 spark-piSparkApplication 对象:

    kubectl apply -f spark-pi.yaml
  4. 使用以下命令检查 SparkApplication 对象的事件:

    kubectl describe sparkapplication spark-pi --namespace spark-operator

有关通过 Spark 运算符向 Spark 提交应用程序的更多信息,请参阅spark-on-k8s-operator文档SparkApplication中的使用 GitHub。

使用亚马逊 S3 进行存储

要使用 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

如果您使用的是 Amazon 7.2.0 及更高EMR版本,则默认包含配置。在这种情况下,您可以将文件路径设置为,s3://<bucket_name>/<file_path>而不是local://<file_path>在 Spark 应用程序YAML文件中。

然后照常提交 Spark 应用程序。