通过spark-submit命令行工具提交Spark任务

本文以ECS连接EMR Serverless Spark为例,介绍如何通过EMR Serverless spark-submit命令行工具进行Spark任务开发。

前提条件

  • 已安装Java 1.8或以上版本。

  • 如果使用RAM用户(子账号)提交Spark任务,需要将RAM用户(子账号)添加至Serverless Spark的工作空间中,并授予开发者或开发者以上的角色权限,操作请参见管理用户和角色

操作流程

步骤一:下载并安装EMR Serverless spark-submit工具

  1. 单击emr-serverless-spark-tool-0.2.0-bin.zip,下载安装包。

  2. 将安装包上传至ECS实例,详情请参见上传或下载文件

  3. 执行以下命令,解压并安装EMR Serverless spark-submit工具。

    unzip emr-serverless-spark-tool-0.2.0-bin.zip

步骤二:配置相关参数

重要

在已安装Spark的环境中,如果系统中设置了SPARK_CONF_DIR 环境变量,则需将配置文件放置在SPARK_CONF_DIR所指定的目录下。例如,在EMR集群中,该目录通常为/etc/taihao-apps/spark-conf。否则,系统会报错。

  1. 执行以下命令,修改connection.properties中的配置。

    vim emr-serverless-spark-tool-0.2.0/conf/connection.properties
  2. 推荐按照如下内容对文件进行配置,参数格式为key=value,示例如下。

    accessKeyId=yourAccessKeyId
    accessKeySecret=yourAccessKeySecret
    # securityToken=yourSecurityToken
    regionId=cn-hangzhou
    endpoint=emr-serverless-spark.cn-hangzhou.aliyuncs.com
    workspaceId=w-xxxxxxxxxxxx
    resourceQueueId=dev_queue
    # networkServiceId=xxxxxx
    releaseVersion=esr-2.2 (Spark 3.3.1, Scala 2.12, Java Runtime)

    涉及参数说明如下表所示。

    参数

    是否必填

    说明

    accessKeyId

    执行Spark任务使用的阿里云账号或RAM用户的AccessKey ID。

    accessKeySecret

    执行Spark任务使用的阿里云账号或RAM用户的AccessKey Secret。

    securityToken

    RAM用户的Token。

    说明

    仅在进行STS认证时需要填写该项。

    regionId

    地域ID。本文以杭州地域为例。

    endpoint

    EMR Serverless Spark的Endpoint。地址详情参见服务接入点

    本文以杭州地域公网访问地址为例,参数值为emr-serverless-spark.cn-hangzhou.aliyuncs.com

    说明

    如果ECS实例没有公网访问能力,需要使用VPC地址。

    workspaceId

    EMR Serverless Spark工作空间ID。

    resourceQueueId

    队列名称。默认值为dev_queue。

    networkServiceId

    网络连接名称。

    说明

    仅当Spark任务需要访问VPC资源时,才需要填写此项。具体操作,请参见EMR Serverless Spark与其他VPC间网络互通

    releaseVersion

    EMR Serverless Spark版本号。例如,esr-2.2 (Spark 3.3.1, Scala 2.12, Java Runtime)。

步骤三:提交Spark任务

  1. 执行以下命令,进入EMR Serverless spark-submit工具目录。

    cd emr-serverless-spark-tool-0.2.0
  2. 请按照以下格式提交任务。

    Java/Scala类型任务

    本文示例使用的spark-examples_2.12-3.3.1.jar,您可以单击spark-examples_2.12-3.3.1.jar,直接下载测试JAR包,然后上传JAR包至OSS。该JAR包是Spark自带的一个简单示例,用于计算圆周率π的值。

    ./bin/spark-submit  --name SparkPi \
    --queue dev_queue  \
    --num-executors 5 \
    --driver-memory 1g \
    --executor-cores 2 \
    --executor-memory 2g \
    --class org.apache.spark.examples.SparkPi \
     oss://<yourBucket>/path/to/spark-examples_2.12-3.3.1.jar \
    10000

    PySpark类型任务

    本文示例使用的DataFrame.py和employee.csv,您可以单击DataFrame.pyemployee.csv,直接下载测试文件,然后上传JAR包至OSS。

    说明
    • DataFrame.py文件是一段使用Apache Spark框架进行OSS上数据处理的代码。

    • employee.csv文件中定义了一个包含员工姓名、部门和薪水的数据列表。

    ./bin/spark-submit --name PySpark \
    --queue dev_queue  \
    --num-executors 5 \
    --driver-memory 1g \
    --executor-cores 2 \
    --executor-memory 2g \
    --conf spark.tags.key=value \
    --files oss://<yourBucket>/path/to/employee.csv \
    oss://<yourBucket>/path/to/DataFrame.py \
    10000

    相关参数说明如下:

    • 兼容开源spark-submit工具的参数。

      参数名称

      示例值

      说明

      --class

      org.apache.spark.examples.SparkPi

      指定Spark任务的入口类名(Java或者Scala程序),Python程序无需此参数。

      --num-executors

      10

      Spark任务的Executor数量。

      --driver-cores

      1

      Spark任务的Driver核数。

      --driver-memory

      4g

      Spark任务的Driver内存。

      --executor-cores

      1

      Spark任务的Executor核数。

      --executor-memory

      1024m

      Spark任务的Executor内存。

      --files

      oss://<yourBucket>/file1,oss://<yourBucket>/file2

      Spark任务需要引用的资源文件,仅支持OSS资源,多个文件使用逗号(,)分隔。

      --py-files

      oss://<yourBucket>/file1.py,oss://<yourBucket>/file2.py

      Spark任务需要引用的Python脚本,仅支持OSS资源,多个文件使用逗号(,)分隔。该参数仅对PySpark程序生效。

      --jars

      oss://<yourBucket>/file1.jar,oss://<yourBucket>/file2.jar

      Spark任务需要引用的JAR包资源,仅支持OSS资源,多个文件使用逗号(,)分隔。

      --archives

      oss://<yourBucket>/archive.tar.gz#env,oss://<yourBucket>/archive2.zip

      Spark任务需要引用的archive包资源,仅支持OSS资源,多个文件使用逗号(,)分隔。

      --queue

      root_queue

      Spark任务运行的队列名称,需与EMR Serverless Spark工作空间队列管理中的队列名称保持一致。

      --conf

      spark.tags.key=value

      Spark任务自定义参数。

      --status

      jr-8598aa9f459d****

      查看Spark任务状态。

      --kill

      jr-8598aa9f459d****

      终止Spark任务。

    • 非开源spark-submit工具的参数。

      参数名称

      示例值

      说明

      --detach

      无需填充

      使用此参数,spark-submit将在提交任务后立即退出,不再等待或查询任务状态。

      --detail

      jr-8598aa9f459d****

      查看Spark任务详情。

    • 不支持的开源spark-submit工具的参数如下:

      • --deploy-mode

      • --master

      • --proxy-user

      • --repositories

      • --keytab

      • --principal

      • --total-executor-cores

      • --driver-library-path

      • --driver-class-path

      • --supervise

      • --verbose

步骤四:查询Spark任务

CLI方式

查询Spark任务状态

cd emr-serverless-spark-tool-0.2.0
./bin/spark-submit --status <jr-8598aa9f459d****>

查询Spark任务详情

cd emr-serverless-spark-tool-0.2.0
./bin/spark-submit --detail <jr-8598aa9f459d****>

UI方式

  1. EMR Serverless Spark页面,单击左侧导航栏中的任务历史

  2. 任务历史开发任务页签,您可以查看提交的任务。

    image

(可选)步骤五:终止Spark任务

cd emr-serverless-spark-tool-0.2.0
./bin/spark-submit --kill <jr-8598aa9f459d****>
说明

仅能终止处于运行状态(running)的任务。