Spark 核心之 Cluster 模式提交命令和特点分析

摘要:这是 Spark 部署模式系列的终章。如果说 Client 模式是你手中的风筝,Cluster 模式就是放飞到云端的无人机——spark-submit 提交后即可退出,Driver 在集群中独立运行。本文从 Standalone-Cluster 与 YARN-Cluster 命令对比、–supervise 与 maxAppAttempts 的 HA 机制、六大核心差异、日志查看四件套、四种生产场景模板五个维度,配合 1 张原创深色架构图和完整可运行示例,助你彻底掌握 Spark Cluster 模式的提交命令。

关键词:spark-submit, Cluster 模式, --deploy-mode cluster, --supervise, Standalone-Cluster, YARN-Cluster, yarn logs, Driver HA


一、开篇:Cluster 模式的终极价值

前文我们详细对比了 Client 模式的 Standalone/YARN 提交命令。但如果你要运行的是一个需要跑 3 小时的生产 ETL 任务,Client 模式有一个致命问题:

spark-submit 进程不能退出——你的笔记本合上盖子,任务就中断了。

Cluster 模式正是为了解决这个问题而设计:

# Cluster 模式提交完即可退出
spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --executor-memory 8G \
  --num-executors 20 \
  etl-job.jar
# ← 提交完成,进程退出
# ← 任务在 YARN 集群中继续运行
# ← 你可以关电脑了

二、Cluster 模式命令全景图

在这里插入图片描述

2.1 通用结构

spark-submit \
  --master <URL> \
  --deploy-mode cluster \       # 🔑 核心区别
  [--supervise] \               # Standalone 专有
  [--driver-*] \                # Driver 资源配置
  [--executor-*] \              # Executor 资源配置
  [--conf k=v] \                # 动态配置
  <app-jar> [app-args]

2.2 --deploy-mode cluster 的语义

--deploy-modeclient 改为 cluster,意味着:

维度ClientCluster
Driver 位置提交客户端 JVMStandalone: Worker 节点 / YARN: AM Container
spark-submit必须全程存活提交后可退出
日志查看控制台直接可见--status / yarn logs / Web UI
Driver HA✅ --supervise / maxAppAttempts

三、Standalone-Cluster 命令

3.1 完整模板

spark-submit \
  --master spark://master-node:7077 \
  --deploy-mode cluster \
  --supervise \
  --class com.example.SparkApp \
  --name "my-cluster-app" \
  --driver-memory 2G \
  --driver-cores 1 \
  --executor-memory 4G \
  --executor-cores 2 \
  --total-executor-cores 16 \
  --conf spark.driver.supervise=true \
  --conf spark.eventLog.enabled=true \
  --conf spark.eventLog.dir=hdfs:///spark-logs \
  /path/to/my-app.jar

3.2 --supervise 详解

场景–supervise 行为
Driver OOMMaster 重新调度到 Worker
Worker 节点宕机Master 调度到其他 Worker
代码确定性 Bug⚠️ 无限重启(需人工介入)
不指定 --superviseDriver 挂了 = 应用永久失败
# 查看应用状态
spark-submit --master spark://master:7077 --status <appId>

# 通过 Web UI 查看 Driver 日志
# http://master:8080 → 应用详情 → stdout/stderr

四、YARN-Cluster 命令

4.1 完整模板

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --class com.example.SparkApp \
  --name "my-yarn-cluster-app" \
  --driver-memory 2G \
  --driver-cores 1 \
  --executor-memory 8G \
  --executor-cores 4 \
  --num-executors 20 \
  --conf spark.yarn.am.memory=2G \
  --conf spark.yarn.queue=production \
  --conf spark.yarn.maxAppAttempts=3 \
  --conf spark.eventLog.enabled=true \
  --conf spark.eventLog.dir=hdfs:///spark-logs \
  /path/to/my-app.jar
# ← spark-submit 立即退出 ✅

4.2 YARN-Cluster 日志四件套

方式命令适用场景
yarn logsyarn logs -applicationId <appId>完整日志拉取
AM 日志yarn logs -appId <id> -containerId <amId>Driver 日志
Web UIhttp://rm-host:8088实时监控
HDFS 日志hdfs dfs -cat /spark-logs/<appId>持久化审计
# 快速查看 Driver(AM) 日志
yarn logs -applicationId application_1234567890_0001 \
  | grep -A 20 "ERROR\|Exception\|FAILED"

五、Standalone-Cluster vs YARN-Cluster 命令速记

# ===== Standalone-Cluster =====
spark-submit \
  --master spark://master:7077 \
  --deploy-mode cluster \
  --supervise \                   # ← Driver 自动重启
  --total-executor-cores 16 \
  app.jar
# 日志:--status + Web UI :8080

# ===== YARN-Cluster =====
spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --num-executors 20 \            # ← 固定 Container 数
  --conf spark.yarn.maxAppAttempts=3 \  # ← AM 重试
  --conf spark.yarn.queue=production \
  app.jar
# 日志:yarn logs + Web UI :8088
维度Standalone-ClusterYARN-Cluster
–masterspark://host:7077yarn
HA 参数--supervisespark.yarn.maxAppAttempts
资源指定--total-executor-cores--num-executors
日志查看--status + Web UIyarn logs + Web UI
队列管理spark.yarn.queue

六、Client vs Cluster 命令六大差异

#维度ClientCluster
1--deploy-modeclientcluster
2spark-submit 生命周期全程存活提交后可退出
3Driver 位置提交客户端Worker / AM Container
4Driver HA✅ --supervise / maxAppAttempts
5日志查看控制台–status / yarn logs
6运维友好度开发调试专用生产首选

七、四种生产场景模板

场景 1:Standalone 集群定时任务

spark-submit \
  --master spark://master:7077 \
  --deploy-mode cluster \
  --supervise \
  --driver-memory 2G \
  --executor-memory 4G \
  --total-executor-cores 16 \
  daily-report.jar

场景 2:YARN 集群大规模 ETL

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --driver-memory 4G \
  --executor-memory 8G \
  --executor-cores 4 \
  --num-executors 40 \
  --conf spark.yarn.queue=production \
  --conf spark.sql.shuffle.partitions=800 \
  etl-pipeline.jar 2025-01-01

场景 3:PySpark ML Pipeline

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --executor-memory 4G \
  --num-executors 16 \
  --conf spark.pyspark.python=/usr/bin/python3 \
  --conf spark.dynamicAllocation.enabled=true \
  ml-training.py --input hdfs:///data/train

场景 4:CI/CD 流水线集成

# Jenkins / GitLab CI 中
APP_ID=$(spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --executor-memory 4G \
  --num-executors 8 \
  integration-test.jar 2>&1 | grep "Submitted application" | awk '{print $NF}')

echo "App ID: $APP_ID"

# 轮询等待完成
while true; do
  STATE=$(yarn application -status $APP_ID | grep "Final-State" | awk '{print $NF}')
  if [ "$STATE" != "UNDEFINED" ]; then
    echo "Final State: $STATE"
    yarn logs -applicationId $APP_ID > test-logs.txt
    break
  fi
  sleep 30
done

八、总结

要点一句话总结
–deploy-modecluster 让 Driver 运行在集群中,spark-submit 可退出
HA 机制Standalone 用 --supervise,YARN 用 maxAppAttempts
日志Standalone 用 --status,YARN 用 yarn logs
生产首选YARN-Cluster = 资源隔离 + 多租户 + HDFS 亲和 + Driver HA

金句--deploy-mode cluster 不是参数的改变,而是运维哲学的升级——从"我盯着任务跑完"到"我提交完就走了"。


作者:starzy | AI Data Engineer / 大数据技术实践者
博客:blog.starzy.cn | GitHub:starzy1990.github.io
专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据技术实践者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值