首页/数据/数据工程与 ETL 速查/spark-submit 提交批作业
管道基础52 条

spark-submit 提交批作业

spark-submit 是 Spark 作业的统一入口:指定 master、资源、依赖与主类;client 模式 driver 在提交机、cluster 模式 driver 在集群内,日志位置不同。

spark-submit 是什么

spark-submit 是 Spark 所有应用的统一提交入口:不管是 Scala、Java 还是 Python 程序,都由它负责解析资源参数、上传依赖、选择集群管理器并创建 ApplicationMaster(或 driver 进程)。同一份代码在不同环境切换,靠的往往是改一组提交参数而不是改代码。

client 与 cluster 模式

client 模式下 driver 跑在提交机上,适合交互式调试,日志直接打在终端;cluster 模式下 driver 在集群里执行,提交后终端即可退出,适合调度系统调用。代价是日志位置不同:cluster 模式的 driver 输出要通过应用日志检索,而不是看提交终端。

基本信息

用途提交 Spark 应用(Scala / Java / Python / R)
集群管理--master 可为 yarn、k8s、spark://host:7077、local[*]
资源参数--num-executors / --executor-cores / --executor-memory / --driver-memory
依赖分发--jars 第三方 jar、--files 分发文件、--py-files 分发 Python 包
任意配置--conf key=value 覆盖 Spark 配置项
参数位置应用自身参数必须写在 jar 或脚本路径之后

典型使用场景

  • 调度系统调用日批作业:cluster 模式提交,提交机不需要常驻进程
  • 本地调试逻辑:local[*] 模式跑小数据集,先把逻辑跑通再上集群
  • 临时排查线上问题:用同一份 jar 加少量参数复现,不修改代码
  • 灰度不同资源配置:用不同的 executor 数量与内存参数跑同一份作业做对比
  • 提交 PySpark 任务:用 --py-files 打包自定义模块,避免在集群节点上手工装包

提交到 YARN 集群

提交到 YARN 集群
# 关键配置示例:资源、队列、参数分发与主类
spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --queue root.etl \
  --num-executors 8 --executor-cores 4 --executor-memory 8g \
  --conf spark.sql.shuffle.partitions=400 \
  --conf spark.dynamicAllocation.enabled=true \
  --class com.example.OrdersJob \
  app.jar --dt 2026-10-11 --dry-run false      # 应用参数写在 jar 之后

# 本地调试:不依赖集群,直接跑小数据集
spark-submit --master local[*] --driver-memory 4g app.jar --dt 2026-10-11

常用参数读法

参数含义注意
--master集群管理器与运行模式写错会退化为本地模式,作业瞬间结束且不报错
--deploy-modedriver 位置(client / cluster)cluster 模式日志不在提交终端
--num-executorsexecutor 数量(YARN 专用)与队列容量相关,超过上限会被排队
--executor-memory每个 executor 内存必须小于 YARN 容器内存上限,否则被 kill
--conf覆盖任意 Spark 配置只能是 Spark 自有配置,应用参数不能放这里

查看运行结果与日志

查看运行结果与日志
# 提交后记录返回的 applicationId,再按它检索日志
yarn application -list | grep OrdersJob
yarn logs -applicationId application_1728000000000_0123

# 只看失败任务的堆栈,定位报错更直接
yarn logs -applicationId application_1728000000000_0123 | grep -A 20 'Exception'
动态资源分配(spark.dynamicAllocation)打开后,executor 数量会按任务量自动增减,此时固定写 --num-executors 意义有限,两者要按集群策略择一使用。
应用参数写在 jar 之前会被 Spark 当成自己的参数解析,常见表现是「参数怎么传都没生效」或直接报无法识别的选项。把 --conf 与 jar 位置分清,比事后逐条排查快得多。

易错点

  • executor 内存设置超过 YARN 容器上限,容器被直接 kill,表现为「作业无报错地消失」,要先看 ResourceManager 日志
  • client 模式提交后依赖提交机常驻,调度系统脚本一退出作业就断,定时任务应使用 cluster 模式
  • 应用参数写错位置(放在 spark-submit 选项区),参数不生效却不报错,排查耗时很长
  • 用固定 --num-executors 与动态资源分配同时配置,两者互相干扰,实际并行度与预期不符

数据来源与参考

  • Apache Spark 官方文档:Submitting Applications
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌