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 | 集群 URL | local[4] / yarn / k8s://url / spark://host:7077 |
| --deploy-mode | 部署模式 | client(默认,Driver 在本机) / cluster(Driver 在集群) |
| --name | 应用名称 | DailyETL |
| --driver-memory | Driver 内存 | 8g |
| --executor-memory | 每个 Executor 内存 | 16g |
| --executor-cores | 每个 Executor CPU 核数 | 4 |
| --num-executors | Executor 数量(YARN) | 20 |
| --py-files | Python 依赖文件(.py/.zip/.egg) | utils.zip |
| --packages | Maven 坐标,自动下载 JAR | org.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 EMR | GCP Dataproc | Azure HDInsight | Databricks |
|---|---|---|---|---|
| 启动时间 | 5-10 分钟 | 90 秒 | 5-10 分钟 | 2-5 分钟(Serverless <1s) |
| Delta Lake | 需手动配置 | 需手动配置 | 需手动配置 | 原生内置 |
| 集成生态 | AWS S3/Glue/Redshift | GCS/BigQuery/Pub/Sub | ADLS/Synapse | 全云厂商 |
| 自动扩缩容 | 支持 | 支持(快) | 支持 | 支持(最佳) |
| 成本模型 | EC2 + EMR 附加费 | GCE 价格,无附加费 | VM 价格 | DBU + 云资源 |
| 适用场景 | AWS 深度绑定用户 | GCP 用户,快速启动 | Azure 用户 | 数据工程/ML 一体化 |
选型建议:如果团队对运维要求低、希望专注数据开发,优先选择 Databricks(或云厂商的 Serverless Spark)。如果有严格的成本控制需求或已有 Kubernetes 平台,选择 Spark on Kubernetes。传统 Hadoop 生态用户继续使用 YARN。