文档

通过spark-submit命令行工具开发Spark应用

更新时间:

本文以ECS连接AnalyticDB MySQL为例,介绍如何通过AnalyticDB MySQL Spark-Submit命令行工具进行Spark作业开发。

背景信息

当您使用客户端连接湖仓版(3.0)集群时,在进行Spark开发时,需要通过AnalyticDB MySQL Spark-Submit命令行工具提交Spark应用。

AnalyticDB MySQLSpark-Submit命令行工具仅用于提交Spark离线应用,不能提交Spark SQL应用。

前提条件

已安装Java 1.8或以上版本。

下载并安装AnalyticDB MySQL Spark-Submit

  1. 在Linux命令行工具,执行以下命令,下载AnalyticDB MySQL Spark-Submit安装包adb-spark-toolkit-submit-0.0.1.tar.gz

    wget https://dla003.oss-cn-hangzhou.aliyuncs.com/adb-spark-toolkit-submit-0.0.1.tar.gz
  2. 执行以下命令,解压并安装AnalyticDB MySQL Spark-Submit。

    tar zxvf adb-spark-toolkit-submit-0.0.1.tar.gz

参数配置

AnalyticDB MySQL Spark离线应用的Conf配置参数既可以直接在conf/spark-defaults.conf配置文件中修改,也可以通过命令行修改。推荐在conf/spark-defaults.conf配置文件中修改,AnalyticDB MySQL Spark-Submit命令行工具的脚本将自动读取Conf配置文件中的信息。如果您通过命令行方式修改了Conf配置参数取值,配置文件中的参数不会被覆盖,离线应用的配置将按照命令行中的配置生效。

  1. AnalyticDB MySQL Spark-Submit安装包解压完成后,执行以下命令,进入修改adb-spark-toolkit-submit/conf/spark-defaults.conf配置项。

    vim adb-spark-toolkit-submit/conf/spark-defaults.conf
  2. 推荐按照如下内容对文件进行配置,参数格式为key=value,示例如下。

    keyId = yourAkId
    secretId = yourAkSec
    regionId = cn-hangzhou
    clusterId = amv-bp15f9q95p****
    rgName = sg-default
    ossUploadPath = oss://<bucket_name>/sparkjars/
    spark.driver.resourceSpec = medium
    spark.executor.instances = 2
    spark.executor.resourceSpec = medium
    spark.adb.roleArn = arn:1234567/adbsparkprocessrole
    spark.adb.eni.vswitchId = vsw-defaultswitch
    spark.adb.eni.securityGroupId = sg-defaultgroup
    spark.app.log.rootPath = oss://<bucket_name>/sparklogs/
    重要
    • 请将参数取值替换为真实值。

    • 示例中的参数keyIdsecretIdregionIdclusterIdrgNameossKeyId、和ossUploadPathAnalyticDB MySQL Spark-Submit命令行工具支持,参数说明请参见参数配置说明

      这些参数也可以在提交Spark作业的命令行中配置。格式为--key1 value1 --key2 value2。或变更参数名称通过Spark Conf配置,详情请参见配置兼容性说明

    • 示例中其他参数说明及AnalyticDB MySQL Spark-Submit命令行工具支持的所有Conf参数,请参见Spark应用配置参数说明

    表 1. 参数配置说明

    参数

    参数说明

    是否必选

    keyId

    执行Spark作业使用的阿里云账号或RAM用户的AccessKey ID。如何查看AccessKey ID,请参见账号与权限

    secretId

    阿里云账号或RAM用户的AccessKeySecret。

    regionId

    湖仓版(3.0)集群所在地域的地域ID。

    clusterId

    AnalyticDB MySQL湖仓版(3.0)集群的ID。

    rgName

    执行Spark作业使用的湖仓版(3.0)集群的资源组名称。

    ossKeyId

    创建OSS Bucket使用的阿里云账号或RAM用户的AccessKey ID。

    当JAR包存储在本地路径中,需要上传JAR包时,可配置OSS参数将本地的JAR包自动上传到OSS路径中。

    ossSecretId

    创建OSS Bucket使用的阿里云账号或RAM用户的AccessKeySecret。

    ossEndpoint

    OSS内网Endpoint。OSS地域与Endpoint的对应关系,请参见访问域名和数据中心

    ossUploadPath

    配置JAR包所在的OSS路径。

配置兼容性说明

为了兼容开源Spark-Submit,keyIdsecretIdregionIdclusterIdrgNameossKeyId、和ossUploadPath非开源Spark配置也可以通过AnalyticDB MySQL Spark Conf进行设置。通过Conf形式配置时,参数名称需要按照下文中的名称配置。

--conf spark.adb.access.key.id=<value>    
--conf spark.adb.access.secret.id=<value>
--conf spark.adb.regionId=<value>
--conf spark.adb.clusterId=<value>
--conf spark.adb.rgName=<value>
--conf spark.adb.oss.akId=<value>
--conf spark.adb.oss.akSec=<value>
--conf spark.adb.oss.endpoint=<value>
--conf spark.adb.oss.uploadPath=<value>

提交Spark作业

  1. 执行以下命令,进入Spark-Submit工具的目录。

    cd adb-spark-toolkit-submit
  2. 按如下格式提交作业。

    ./bin/spark-submit  \
    --class com.aliyun.spark.oss.SparkReadOss \
    --verbose \
    --name <your_job_name> \
    --jars oss://<bucket-name>/jars/xxx.jar,oss://<bucket-name>/jars/xxx.jar\
    --conf spark.driver.resourceSpec=medium \
    --conf spark.executor.instances=1 \
    --conf spark.executor.resourceSpec=medium \
    oss://<bucket-name>/jars/xxx.jar args0 args1
    说明

    Spark作业提交后,返回码说明如下:

    • 255:作业执行失败。

    • 0:作业执行成功。

    • 143:作业被Kill。

参数说明如下。

参数名称

示例值

参数说明

--class

<class_name>

Java或者Scala程序入口类名称。Python不需要指定入口类。

--verbose

打印出提交Spark过程中产生的日志。

--name

<spark_name>

Spark应用名称。

--jars

<jar_name>

Spark应用依赖的JAR包,多个JAR包之间以英文逗号(,)分隔。需填写JAR包文件的绝对路径。

  • 用户可使用--oss-upload-path或者在conf/spark-defaults.conf配置文件中设置ossUploadPath的值来指定文件资源上传到OSS的路径。

  • 文件资源上传时,会使用md5校验文件内容,当指定的OSS路中有相同文件名且md5相同时,将不再重复上传。

  • 如果手动更新了OSS路径中的JAR包,请删除对应的md5文件。

说明

由于Spark-Submit上传本地JAR包时,需要RAM用户拥有对OSS的访问权限。您可以登录RAM访问控制,在用户页面为对应RAM用户添加AliyunOSSFullAccess权限。

--conf

<key=value>

Spark应用的配置参数。

与开源Spark-Submit中的配置基本一致。与开源Spark-Submit用法不一致的配置参数及AnalyticDB MySQL Spark-Submit特有的配置参数,请参见AnalyticDB MySQL Spark-Submit特有的参数Spark应用配置参数说明

说明
  • 配置多个conf时,格式为:--conf key1=value1 --conf key2=value2。

  • 如果命令行和配置文件都配置了,以命令行中的配置为准。

oss://<bucket-name>/jars/xxx.jar

<oss_path>

Spark应用主文件的存储路径,文件路径需为绝对路径。主文件是入口类所在的JAR包或者Python的入口执行文件。

说明

Spark应用主文件目前只支持存储在OSS中。

args

<args0 args1>

请根据业务需求,填写使用JAR包时需要使用的参数。多个参数之间以空格分隔。

查看Spark作业列表

./bin/spark-submit --list --clusterId <cluster_Id>  --rgName <ResourceGroup_name> --pagenumber 1 --pagesize 3

查询Spark作业状态

./bin/spark-submit --status <appId>

appId可在Spark作业列表中查看,详情请参见查看Spark作业列表

Spark作业状态列表,详情请参见SparkAppInfo

查询Spark作业提交参数和SparkUI

./bin/spark-submit --detail <appId>

appId可在Spark作业列表中查看,详情请参见查看Spark作业列表

返回结果中Spark WEB UI字段即Spark UI地址。

查询Spark作业日志

./bin/spark-submit --get-log <appId>

appId可在Spark作业列表中查看,详情请参见查看Spark作业列表

结束Spark作业

./spark-submit --kill <appId>

appId可在Spark作业列表中查看,详情请参见查看Spark作业列表

AnalyticDB MySQL Spark-Submit与开源Spark-Submit的区别

AnalyticDB MySQL Spark-Submit特有的参数

表 2. AnalyticDB MySQL Spark-Submit特有的参数

参数名称

参数说明

--api-retry-times

AnalyticDB MySQL Spark-Submit内部执行命令失败时的重试次数(除提交命令外)。提交任务不是一个幂等操作,由于网络超时等原因导致的提交失败,实际上任务可能在后台执行成功,为防止任务重复提交,提交任务失败将不会重试。您需要自行获取已经提交的任务列表(--list),或者在AnalyticDB MySQL Spark控制台查看任务列表判断任务是否提交成功。

--time-out-seconds

AnalyticDB MySQL Spark-Submit内部默认的网络超时时间,超时命令将会失败重试。单位:秒(s),默认值:10。

--enable-inner-endpoint

当您使用阿里云ECS机器提交Spark时,可以指定此选项,AnalyticDB MySQL Spark-Submit将使用VPC内网环境来访问各个服务。

重要

内网访问在某些地域处于待开启状态,并非所有地域都可以支持。目前支持中国内地杭州、上海和深圳地域。

--list

获取作业列表,常搭配--pagenumber--pagesize使用。

例如,返回第一页的5个作业,则配置如下:

--list 
--pagenumber 1 
--pagesize 5

--pagenumber

指定作业列表的页数。默认值为1。

--pagesize

指定作业列表每页显示的作业个数。默认值为10。

--kill

终止应用。

--get-log

查询应用日志。

--status

查询应用详情。

AnalyticDB MySQL Spark-Submit不支持的开源Spark-Submit参数

AnalyticDB MySQL Spark-Submit暂不支持开源Spark-Submit的配置参数。详情请参见AnalyticDB MySQL不支持的配置参数