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-mode | driver 位置(client / cluster) | cluster 模式日志不在提交终端 |
| --num-executors | executor 数量(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 位置分清,比事后逐条排查快得多。