Chapter 09

集群部署与云平台

从 Standalone 到 Kubernetes,从 spark-submit 到 Databricks——生产环境 Spark 部署全攻略

Standalone 集群搭建

Standalone 是 Spark 内置的轻量级集群管理器,无需安装 Hadoop,适合小型私有集群。

# 假设已在所有节点安装相同版本 Spark,并配置免密 SSH

# 1. 配置 conf/workers(Spark 3.x,旧版为 conf/slaves)
# worker-node-1
# worker-node-2
# worker-node-3

# 2. 配置 conf/spark-env.sh
# export JAVA_HOME=/usr/lib/jvm/java-11
# export SPARK_WORKER_CORES=8      # 每个 Worker 可用核数
# export SPARK_WORKER_MEMORY=32g   # 每个 Worker 可用内存

# 3. 在 Master 节点启动集群
$SPARK_HOME/sbin/start-all.sh

# 4. 查看集群状态(Web UI)
# http://master-host:8080

# 5. 提交作业到 Standalone 集群
spark-submit \
  --master spark://master-host:7077 \
  --deploy-mode cluster \
  --driver-memory 4g \
  --executor-memory 8g \
  --executor-cores 4 \
  --total-executor-cores 32 \
  my_app.py

YARN 模式(Hadoop 生态)

YARN(Yet Another Resource Negotiator)是 Hadoop 的资源管理器。在已有 Hadoop 集群的企业中,YARN 模式最为常见。

# YARN 模式:--master yarn,不需要指定 Master 地址
# HADOOP_CONF_DIR 或 YARN_CONF_DIR 需要指向 Hadoop 配置目录
export HADOOP_CONF_DIR=/etc/hadoop/conf

spark-submit \
  --master yarn \
  --deploy-mode cluster \       # cluster: Driver 在 YARN AM 中; client: Driver 在提交机上
  --driver-memory 8g \
  --executor-memory 16g \
  --executor-cores 4 \
  --num-executors 20 \
  --queue default \             # YARN 队列
  --conf spark.yarn.maxAppAttempts=2 \
  --conf spark.yarn.am.memory=4g \
  my_app.py

# 查看作业日志
yarn logs -applicationId application_1234567890_0001

Kubernetes 模式(现代云原生)

Spark 3.1 起 Kubernetes 模式已达到生产就绪(Production-Ready),支持动态资源分配、Pod 模板自定义,是云原生场景的首选部署方式。

# 构建 Spark Docker 镜像
$SPARK_HOME/bin/docker-image-tool.sh \
  -r docker.io/myrepo \
  -t v3.5.1 \
  -p kubernetes/dockerfiles/spark/bindings/python/Dockerfile \
  build

# 提交到 Kubernetes
spark-submit \
  --master k8s://https://k8s-api-server:443 \
  --deploy-mode cluster \
  --name my-spark-job \
  --conf spark.executor.instances=10 \
  --conf spark.kubernetes.container.image=myrepo/spark-py:v3.5.1 \
  --conf spark.kubernetes.namespace=spark-jobs \
  --conf spark.kubernetes.driver.podTemplateFile=driver-pod.yaml \
  --conf spark.kubernetes.executor.podTemplateFile=executor-pod.yaml \
  --conf spark.kubernetes.executor.deleteOnTermination=true \
  local:///opt/spark/work-dir/my_app.py

# 动态资源分配(Spark on K8s 推荐)
# --conf spark.dynamicAllocation.enabled=true
# --conf spark.dynamicAllocation.shuffleTracking.enabled=true
# --conf spark.dynamicAllocation.minExecutors=2
# --conf spark.dynamicAllocation.maxExecutors=50

spark-submit 参数详解

参数说明示例
--master集群 URLlocal[4] / yarn / k8s://url / spark://host:7077
--deploy-mode部署模式client(默认,Driver 在本机) / cluster(Driver 在集群)
--name应用名称DailyETL
--driver-memoryDriver 内存8g
--executor-memory每个 Executor 内存16g
--executor-cores每个 Executor CPU 核数4
--num-executorsExecutor 数量(YARN)20
--py-filesPython 依赖文件(.py/.zip/.egg)utils.zip
--packagesMaven 坐标,自动下载 JARorg.apache.spark:spark-sql-kafka-0-10_2.12:3.5.1
--conf任意 Spark 配置项spark.sql.shuffle.partitions=400
--jars额外 JAR 包mysql-connector.jar
--files分发到各 Executor 的文件config.json

Databricks:托管 Spark 平台

Databricks 是由 Spark 创始团队创建的商业云平台,提供全托管的 Spark 环境,内置 Delta Lake、Unity Catalog(元数据管理)和 MLflow(机器学习生命周期管理)。

Delta Lake 原生

ACID 事务、时间旅行、自动优化(OPTIMIZE + ZORDER),无需额外配置

📊

Unity Catalog

统一的数据治理层,细粒度权限控制,跨工作区的数据发现和共享

🤖

MLflow 集成

模型训练追踪、版本管理、模型注册表和一键部署,ML 生命周期一体化

无服务器计算

Serverless SQL 和 Serverless Jobs,按查询计费,无需管理集群

云托管服务对比

平台AWS EMRGCP DataprocAzure HDInsightDatabricks
启动时间5-10 分钟90 秒5-10 分钟2-5 分钟(Serverless <1s)
Delta Lake需手动配置需手动配置需手动配置原生内置
集成生态AWS S3/Glue/RedshiftGCS/BigQuery/Pub/SubADLS/Synapse全云厂商
自动扩缩容支持支持(快)支持支持(最佳)
成本模型EC2 + EMR 附加费GCE 价格,无附加费VM 价格DBU + 云资源
适用场景AWS 深度绑定用户GCP 用户,快速启动Azure 用户数据工程/ML 一体化

选型建议:如果团队对运维要求低、希望专注数据开发,优先选择 Databricks(或云厂商的 Serverless Spark)。如果有严格的成本控制需求或已有 Kubernetes 平台,选择 Spark on Kubernetes。传统 Hadoop 生态用户继续使用 YARN