EMR支持CRD和spark-submit两种方式提交作业。本文为您介绍如何通过kubectl提交作业。

前提条件

已在E-MapReduce on ACK控制台创建Spark集群,详情请参见快速入门

方式一:使用CRD方式提交作业(推荐)

  1. 通过kubectl连接Kubernetes集群,详情请参见通过kubectl工具连接集群
  2. 新建spark-pi.yaml文件,文件内容如下。
    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-pi-simple
    spec:
      type: Scala
      sparkVersion: 3.1.1
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar"
      arguments:
        - "1000"
      driver:
        cores: 1
        coreLimit: 1000m
        memory: 4g
      executor:
        cores: 1
        coreLimit: 1000m
        memory: 8g
        memoryOverhead: 1g
        instances: 1

    本文示例中的参数描述,请参见spark-on-k8s-operator

    说明
    • 文件名您可以自定义,本文以spark-pi.yaml为例介绍。
    • 版本以Spark 3.1.1为例,其它版本时请修改sparkVersionmainApplicationFile的配置。
  3. 执行如下命令,提交作业。
    kubectl apply -f spark-pi.yaml --namespace <集群对应的namespace>

    本文示例代码中的<集群对应的namespace>,需要替换为集群的命名空间,您可以登录E-MapReduce on ACK控制台,在集群详情页面查看。

    返回如下信息。
    sparkapplication.sparkoperator.k8s.io/spark-pi-simple created
    说明 spark-pi-simple为本示例提交任务后的作业名。
  4. 可选:您可以在集群详情页面的作业区域,查看已创建的作业信息。
    task

方式二:使用spark-submit方式提交作业

  1. 通过kubectl连接Kubernetes集群,详情请参见通过kubectl工具连接集群
  2. 新建spark-submit-pod.yaml文件,文件内容如下。
    apiVersion: v1
    kind: Pod
    metadata:
      name: spark-submit
    spec:
      serviceAccount: spark
      terminationGracePeriodSeconds: 0
      imagePullSecrets:
      - name: emr-image-regsecret
      containers:
      - name: spark-submit-container
      # 以下是Spark 3.1.1版本的默认镜像,您可以根据实际情况修改。
      # 以下以cn-hangzhou为例,请替换为您创建集群所在的Region。
        image: registry-vpc.cn-hangzhou.aliyuncs.com/emr/spark-py:emr-3.1.1-latest
        imagePullPolicy: Always
        command: ["/bin/sh", "-c", "tail -f /dev/null"]
        env:
          - name: SPARK_CONF_DIR
            value: /etc/spark/conf
      # 将集群配置信息挂载到Gateway的环境中。
        volumeMounts:
        - name: config-volume
          mountPath: /etc/spark/conf
        - name: bigboot-config-volume
          mountPath: /usr/lib/b2smartdata-current/conf
      volumes:
        - name: config-volume
          configMap:
            name: emr-spark-defaults-conf
        - name: bigboot-config-volume
          configMap:
            name: bigboot-config
    说明
    • 文件名您可以自定义,本文以spark-submit-pod.yaml为例介绍。
    • 镜像信息,需要根据您的地域和Spark版本替换。下面以杭州地域为例,image取值如下:
      • Spark 2.4.5版本:registry-vpc.cn-hangzhou.aliyuncs.com/emr/spark-py:emr-2.4.5-latest
      • Spark 2.4.7版本:registry-vpc.cn-hangzhou.aliyuncs.com/emr/spark-py:emr-2.4.7-latest
      • Spark 3.1.1版本:registry-vpc.cn-hangzhou.aliyuncs.com/emr/spark-py:emr-3.1.1-latest
  3. 执行以下命令,使用步骤2新建的文件创建一个Gateway pod。
    kubectl apply -f spark-submit-pod.yaml -n <集群对应的namespace>
  4. 执行以下命令,提交作业。
    • Cluster模式示例
      kubectl exec spark-submit -it -n <集群对应的namespace> -- /bin/bash\
          spark-submit \
          --deploy-mode cluster \
          --name spark-pi-submit \
          --class org.apache.spark.examples.SparkPi \
          local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar
      说明 本示例以Spark 3.1.1版本为例,其他版本请修改命令结尾处JAR的路径配置。更多参数的详细信息,请参见Spark Overview
    • Client模式示例
      • spark-sql命令方式
        kubectl exec spark-submit -it -n <集群对应的namespace> -- /bin/bash spark-sql
      • spark-shell命令方式
        kubectl exec spark-submit -it -n <集群对应的namespace> -- /bin/bash spark-shell
        代码示例及返回信息见下图。result
  5. 可选:您可以在集群详情页面,查看已创建的作业信息。

相关文档