摘要
本文以 ECS 连接阿里云 EMR Serverless Spark 为例,介绍如何通过 EMR Serverless spark-submit 命令行工具进行 Spark 任务开发。
前提条件
已安装Java 1.8或以上版本。
如果使用 RAM 用户(子账号)提交 Spark 任务,需要将 RAM 用户(子账号)添加至 Serverless Spark 的工作空间中,并授予开发者或开发者以上的角色权限,操作请参见管理用户和角色[1]。
操作流程
步骤一:下载并安装 EMR Serverless spark-submit 工具
1. 单击 emr-serverless-spark-tool-0.1.0-bin.zip[2],下载安装包。
2. 将安装包上传至 ECS 实例,详情请参见上传或下载文件[3]。
3. 执行以下命令,解压并安装 EMR Serverless spark-submit 工具。
unzip emr-serverless-spark-tool-0.1.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.1.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.1 (Spark 3.3.1, Scala 2.12)
涉及参数说明如下表所示:
参数 | 是否必填 | 说明 |
accessKeyId | 是 | 执行Spark任务使用的阿里云账号或RAM用户的AccessKey ID。 |
accessKeySecret | 是 | 执行Spark任务使用的阿里云账号或RAM用户的AccessKey Secret。 |
securityToken | 否 | RAM用户的Token。 说明:仅在进行STS认证时需要填写该项。 |
regionId | 是 | 地域ID。本文以杭州地域为例。 |
endpoint | 是 | EMR Serverless Spark的Endpoint。地址详情参见服务接入点[4]。 本文以杭州地域公网访问地址为例,参数值为emr-serverless-spark.cn-hangzhou.aliyuncs.com。 说明:如果ECS实例没有公网访问能力,需要使用VPC地址。 |
workspaceId | 是 | EMR Serverless Spark工作空间ID。 |
resourceQueueId | 否 | 队列名称。默认值为dev_queue。 |
networkServiceId | 否 | 网络连接名称。 说明:仅当Spark任务需要访问VPC资源时,才需要填写此项。具体操作,请参见EMR Serverless Spark与其他VPC间网络互通[5]。 |
releaseVersion | 否 | EMR Serverless Spark版本号。例如,esr-2.1(Spark 3.3.1, Scala 2.12)。 |
步骤三:提交 Spark 任务
1. 执行以下命令,进入 EMR Serverless spark-submit 工具目录。
cd emr-serverless-spark-tool-0.1.0
2. 请按照以下格式提交任务。
Java/Scala 类型任务
本文示例使用的 spark-examples_2.12-3.3.1.jar,您可以打开 spark-examples_2.12-3.3.1.jar[6],直接下载测试 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.py[7]和employee.csv[8],直接下载测试文件,然后上传 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.1.0
./bin/spark-submit --status <jr-8598aa9f459d****>
查询 Spark 任务详情
cd emr-serverless-spark-tool-0.1.0
./bin/spark-submit --detail <jr-8598aa9f459d****>
UI 方式
在 EMR Serverless Spark 页面,单击左侧导航栏中的任务历史。
在任务历史的开发任务页签,您可以查看提交的任务。
步骤五:终止 Spark 任务(可选)
cd emr-serverless-spark-tool-0.1.0
./bin/spark-submit --kill <jr-8598aa9f459d****>
说明:仅能终止处于运行状态(running)的任务。
相关文档
[1]管理用户和角色:https://help.aliyun.com/zh/emr/emr-serverless-spark/user-guide/manage-users-and-roles
[2]emr-serverless-spark-tool-0.1.0-bin.zip:https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240829/dzzgsn/emr-serverless-spark-tool-0.1.0-bin.zip
[3]上传或下载文件:https://help.aliyun.com/zh/ecs/use-cases/upload-a-file-from-on-premises-to-an-ecs-instance/
[4]服务接入点:https://help.aliyun.com/zh/emr/emr-serverless-spark/developer-reference/api-emr-serverless-spark-2023-08-08-endpoint
[5]EMR Serverless Spark与其他VPC间网络互通:
https://help.aliyun.com/zh/emr/emr-serverless-spark/user-guide/network-connection-between-emr-serverless-spark-and-other-vpcs
[6]spark-examples_2.12-3.3.1.jar:
https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240207/cmalbs/spark-examples_2.12-3.3.1.jar
[7]DataFrame.py:
https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240418/mzftlh/DataFrame.py
[8]employee.csv:
https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240418/ktzzqn/employee.csv
阿里云 EMR Serverless Spark 版已于2024年9月14日正式商业化售卖,欢迎使用!
如果您在使用 EMR Serverless Spark 版的过程中遇到任何疑问,可加入钉钉群(群号:58570004119)咨询。
点击「阅读原文」查看产品详情!