Skip to content

Spark 完整安装教程(Standalone 集群版) ​

适用环境:CentOS 7/8 虚拟机集群(教学/实验) 版本组合:Spark 3.5.x + Hadoop 3.3.x(可选)+ JDK 1.8 + Scala 2.12/2.13 最新版本参考:Spark 4.2.0(2026-07 发布)、Spark 3.5.9(3.5 长期维护系列)


目录 ​


一、安装前规划 ​

1.1 集群节点规划 ​

节点IP(示例)角色建议内存建议 CPU
master192.168.128.130Master(调度) + Worker(计算)4G+4 核
slave1192.168.128.131Worker(计算)4G+4 核
slave2192.168.128.132Worker(计算)4G+4 核

💡 命名与 IP 原则:

  • 主机名建议用 master、slave1、slave2,简洁好记,与教材一致
  • IP 用静态 IP,不要用 DHCP 自动分配(重启后 IP 变化会导致集群配置失效)
  • 教学环境内存不够时,可以 3 台各 2G,但 Worker 内存(SPARK_WORKER_MEMORY)要相应调低

1.2 软件版本对照 ​

软件版本说明
LinuxCentOS 7.x / 8.x教学环境最常用;Ubuntu 22.04 也可以
JDK1.8.0_xxxSpark 3.x 官方要求 JDK 8/11/17,教学用 JDK 8 最稳
Hadoop3.3.xStandalone 模式可选;要读写 HDFS 才需要
Spark3.5.x预构建包:spark-3.5.x-bin-hadoop3 或 -scala2.13
Scala2.12 / 2.13Spark 自带,不用单独装

⚠️ 版本匹配是最大的坑:

  • spark-3.5.1-bin-hadoop3-scala2.13.tgz:Scala 2.13 版
  • spark-3.5.1-bin-hadoop3.tgz:Scala 2.12 版
  • 下载时选错 Scala 版本,会导致依赖的 Scala 库报 NoSuchMethodError 之类异常
  • Spark 4.x 默认 Scala 2.13,且停止支持 Scala 2.12,升级时注意

1.3 端口规划 ​

端口用途配置文件
7077Spark Master 通信端口(类似 YARN 的 8032)spark-env.sh 的 SPARK_MASTER_PORT
8080Spark Master Web UIspark-env.sh 的 SPARK_MASTER_WEBUI_PORT
8081Spark Worker Web UIspark-env.sh 的 SPARK_WORKER_WEBUI_PORT
4040每个 Driver 的 SparkContext Web UI(动态)spark-defaults.conf
18080Spark History Serverspark-defaults.conf
8020/9000HDFS NameNode(若装 Hadoop)core-site.xml

⚠️ 8080 常被其他服务占用(如 Linux 的 web 管理工具),被占用时改 SPARK_MASTER_WEBUI_PORT。


二、基础环境准备(所有节点) ​

以下命令在 3 台机器上都要执行(除非特别说明只在 master 上做)。

2.1 修改主机名 ​

bash
# 修改主机名(master 节点)
hostnamectl set-hostname master

# slave1 节点
hostnamectl set-hostname slave1

# slave2 节点
hostnamectl set-hostname slave2

# 验证
hostname

2.2 配置 /etc/hosts(所有节点,内容相同) ​

bash
vi /etc/hosts

添加以下内容(把 IP 换成你实际规划的):

192.168.128.130 master
192.168.128.131 slave1
192.168.128.132 slave2

⚠️ hosts 不配好,集群必挂: Spark 集群节点之间通过主机名通信。hosts 缺失会导致:

  • Worker 注册失败(无法解析 master)
  • 提交任务时报 UnknownHostException
  • 此文件每台机器都要配,且内容一致

2.3 关闭防火墙与 SELinux(实验环境强烈建议) ​

bash
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld   # 显示 inactive (dead) 即成功

# 永久关闭 SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
getenforce                # 输出 Permissive 或 Disabled 即成功

⚠️ 企业生产环境不要关防火墙,用白名单放行端口。这里关是为了教学集群省事。

2.4 时间同步 ​

bash
# 安装 ntpdate 并同步
yum install -y ntpdate
ntpdate -u ntp.aliyun.com

# 加入定时任务(每小时同步一次)
echo "0 * * * * /usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1" >> /var/spool/cron/root

💡 集群节点时间不一致会导致:任务超时、数据一致性校验失败、Kerberos 认证失败(企业场景)。

2.5 安装 JDK ​

方式一:rpm 安装(推荐) ​

bash
# 1. 上传或下载 jdk-8uXXX-linux-x64.rpm
# 2. 安装
rpm -ivh jdk-8u461-linux-x64.rpm

# 3. 验证
java -version
# 应输出:
# java version "1.8.0_461"
# Java(TM) SE Runtime Environment ...

方式二:tar.gz 解压安装 ​

bash
mkdir -p /usr/local/java
tar -zxvf jdk-8u461-linux-x64.tar.gz -C /usr/local/java

# 配置环境变量
vi /etc/profile
bash
# 文件末尾追加
export JAVA_HOME=/usr/local/java/jdk1.8.0_461
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
bash
# 生效并验证
source /etc/profile
java -version

💡 为什么必须 JDK 8? Spark 3.x 官方要求 Java 8/11/17。教学环境统一 JDK 8,避免高版本 JDK 的模块化限制导致的各种兼容问题。


三、SSH 免密登录 ​

3.1 为什么要免密 ​

Spark 集群启动时,master 通过 SSH 登录到各 slave 节点启动 Worker 进程。不配免密,每次启动都要输密码,集群无法自动拉起。

3.2 配置步骤(只在 master 上操作) ​

bash
# 1. 生成密钥对(一路回车即可)
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

# 2. 分发公钥到所有节点(包括自己)
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2

# 3. 验证免密(分别测试,应该不用输密码)
ssh master hostname
ssh slave1 hostname
ssh slave2 hostname

3.3 易错点 ​

报错原因解决
Permission denied (publickey)公钥没分发成功重新 ssh-copy-id
~/.ssh 权限不对目录或文件权限过宽chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
还是要输密码密钥没被追加检查 master 公钥是否在目标机 authorized_keys 里
ssh-copy-id 命令不存在CentOS 精简安装yum install -y openssh-clients

💡 原理一句话:master 生成一对密钥(私钥自己留、公钥发给别人),登录时用私钥签名,对方用公钥验证。配一次,整个集群通用。


四、Hadoop 安装(可选但推荐) ​

4.1 到底要不要装 Hadoop? ​

场景是否需要 Hadoop
只学 Spark 计算(读本地文件/内存数据)❌ 不需要,Spark Standalone 即可
要读写 HDFS(大数据存储)✅ 需要
用 YARN 模式提交任务✅ 需要
教学完整课程(教材有 HDFS 章节)✅ 强烈建议

💡 Spark 预构建包(-bin-hadoop3)自带了 Hadoop 客户端库,所以不装 Hadoop 也能跑 Spark,只是没有 HDFS 可读写。先装 Hadoop 再装 Spark,是最标准的教学路径。

4.2 Hadoop 快速安装(完全分布式) ​

1. 下载解压(master 上,然后分发) ​

bash
cd /usr/local
tar -zxvf hadoop-3.3.6.tar.gz
mv hadoop-3.3.6 hadoop

# 分发到 slave1、slave2
scp -r /usr/local/hadoop slave1:/usr/local/
scp -r /usr/local/hadoop slave2:/usr/local/

2. 配置环境变量(所有节点) ​

bash
vi /etc/profile
bash
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
bash
source /etc/profile
hadoop version

3. 修改配置文件($HADOOP_HOME/etc/hadoop/) ​

hadoop-env.sh:

bash
export JAVA_HOME=/usr/local/java/jdk1.8.0_461

core-site.xml:

xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>

hdfs-site.xml:

xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/hadoop/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/hadoop/datanode</value>
    </property>
</configuration>

workers(旧版叫 slaves):

master
slave1
slave2

4. 格式化 NameNode(只在 master,只做一次) ​

bash
hdfs namenode -format

5. 启动 HDFS ​

bash
start-dfs.sh
jps

预期进程:

节点应出现的进程
masterNameNode、DataNode、SecondaryNameNode
slave1DataNode
slave2DataNode

⚠️ 格式化只能做一次:重复格式化会导致 DataNode 和 NameNode 的 clusterID 不一致,报 Incompatible clusterIDs 错误。要重来就删掉所有节点的 namenode/datanode 数据目录再格式化。

6. 验证 HDFS ​

bash
hdfs dfs -mkdir -p /spark/input
hdfs dfs -put /etc/hosts /spark/input/
hdfs dfs -ls /spark/input

五、Spark 安装与配置 ​

5.1 下载 ​

官方地址 ​

教学推荐版本 ​

spark-3.5.1-bin-hadoop3.tgz        (Scala 2.12 版,教材同款)
spark-3.5.1-bin-hadoop3-scala2.13.tgz (Scala 2.13 版)

国内镜像(下载快) ​

bash
# 清华镜像
wget -P /usr/local https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz

# 或阿里云镜像
wget -P /usr/local https://mirrors.aliyun.com/apache/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz

5.2 解压与目录规划 ​

bash
cd /usr/local
tar -zxvf spark-3.5.1-bin-hadoop3.tgz
mv spark-3.5.1-bin-hadoop3 spark

Spark 目录结构说明 ​

目录/文件作用
bin/可执行脚本(spark-shell、spark-submit、spark-sql、pyspark)
sbin/集群管理脚本(start-master、start-workers、start-all)
conf/配置文件目录
jars/所有依赖 jar 包(Spark 是"自带全家桶")
data/自带示例数据
examples/官方示例代码(jar 和源码)
python/PySpark 相关
LICENSE / NOTICE开源许可文件

5.3 分发到从节点 ​

bash
scp -r /usr/local/spark slave1:/usr/local/
scp -r /usr/local/spark slave2:/usr/local/

⚠️ 也可以每个节点单独下载解压,但 scp 分发更快且保证版本一致。

5.4 配置环境变量(所有节点) ​

bash
vi /etc/profile
bash
export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
bash
source /etc/profile

5.5 修改配置文件 ​

文件 1:spark-env.sh(核心) ​

bash
cd /usr/local/spark/conf
cp spark-env.sh.template spark-env.sh
vi spark-env.sh
bash
# 文件末尾追加:
export JAVA_HOME=/usr/local/java/jdk1.8.0_461
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_WORKER_CORES=4
export SPARK_WORKER_MEMORY=3g
export SPARK_WORKER_WEBUI_PORT=8081
参数作用说明
SPARK_MASTER_HOSTMaster 所在主机名必须和 hosts 一致
SPARK_MASTER_PORTMaster 通信端口默认 7077
SPARK_WORKER_CORES每个 Worker 可用 CPU 核数不要超过机器实际核数
SPARK_WORKER_MEMORY每个 Worker 可用内存留出系统余量,如 4G 机器给 3g
SPARK_WORKER_WEBUI_PORTWorker 页面端口默认 8081

⚠️ 内存别给满:SPARK_WORKER_MEMORY 给满会导致系统 OOM,Worker 直接被系统杀掉。4G 虚拟机给 3g,留 1G 给操作系统。

文件 2:workers(从节点列表) ​

bash
cd /usr/local/spark/conf
cp workers.template workers
vi workers
bash
# 删除 localhost,改为:
master
slave1
slave2

⚠️ 旧版叫 slaves,3.0+ 改名 workers:网上很多教程还在写 slaves,3.5.x 已经不支持 slaves 文件了,写错文件 Worker 一个都起不来。

文件 3:spark-defaults.conf(可选,推荐配置) ​

bash
cp spark-defaults.conf.template spark-defaults.conf
vi spark-defaults.conf
bash
# 提交任务的默认参数
spark.master                     spark://master:7077
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory              1g
spark.executor.memory            2g
# 日志(History Server 用)
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://master:9000/spark-logs
spark.history.fs.logDirectory    hdfs://master:9000/spark-logs

文件 4:log4j2.properties(可选) ​

bash
cp log4j2.properties.template log4j2.properties
# 将 INFO 改为 WARN,减少控制台刷屏

5.6 分发配置到从节点 ​

bash
scp -r /usr/local/spark/conf/* slave1:/usr/local/spark/conf/
scp -r /usr/local/spark/conf/* slave2:/usr/local/spark/conf/

六、启动集群与验证 ​

6.1 启动顺序 ​

bash
# 如果有 Hadoop,先启动 HDFS(在 master 上)
start-dfs.sh

# 启动 Spark 集群(在 master 上执行)
start-all.sh

⚠️ start-all.sh 在装了 Hadoop 的环境可能被 Hadoop 的脚本覆盖,报找不到命令。此时用全路径或显式调用:

bash
/usr/local/spark/sbin/start-all.sh

手动启动(了解底层,排错用) ​

bash
# 先启动 Master
/usr/local/spark/sbin/start-master.sh

# 再启动所有 Worker
/usr/local/spark/sbin/start-workers.sh

6.2 验证进程 ​

bash
jps

预期结果:

节点进程说明
masterMaster、Worker、(NameNode、DataNode)Worker 因为 master 自己也参与计算
slave1Worker、(DataNode)
slave2Worker、(DataNode)

💡 如果 master 上没看到 Worker,说明 workers 文件没配对或免密没通;如果 slave 上没看到 Worker,先看 $SPARK_HOME/logs/ 下的日志。

6.3 Web UI 验证 ​

地址内容
http://master:8080Spark Master 页面:Worker 列表、运行中的应用、任务历史
http://master:8081某个 Worker 的详细信息(CPU/内存使用)
http://master:4040正在运行应用的 SparkContext 页面(任务级 DAG)
http://master:18080History Server(历史任务日志,需单独启动)

Master 页面关键信息:

  • Workers:3 个,状态 Alive,显示每个 Worker 的核数和内存
  • Running Applications:当前运行的任务
  • Completed Applications:已完成任务

6.4 启动 History Server(可选) ​

bash
# 需要先建 HDFS 目录
hdfs dfs -mkdir -p /spark-logs

# 启动
/usr/local/spark/sbin/start-history-server.sh

# 页面:http://master:18080

七、运行第一个 Spark 程序 ​

7.1 跑官方示例:计算 π ​

bash
spark-submit --class org.apache.spark.examples.SparkPi \
  --master spark://master:7077 \
  /usr/local/spark/examples/jars/spark-examples_2.12-3.5.1.jar 10
  • 参数 10 是计算精度(迭代次数)
  • 输出类似:Pi is roughly 3.141592653589793

💡 能跑通 SparkPi = 集群搭建成功,这是最标准的验收方式。

7.2 交互式 Shell 测试 ​

bash
# Scala 版
spark-shell --master spark://master:7077

# Python 版
pyspark --master spark://master:7077

进入后测试:

scala
val rdd = sc.parallelize(1 to 100, 4)
rdd.sum()
// res: Double = 5050.0

7.3 WordCount 完整测试(读 HDFS) ​

bash
# 1. 准备数据(HDFS 已启动的情况下)
hdfs dfs -mkdir -p /spark/input
hdfs dfs -put /etc/hosts /spark/input/

# 2. 用 spark-shell 写 WordCount
spark-shell --master spark://master:7077
scala
val textFile = sc.textFile("hdfs://master:9000/spark/input/hosts")
val counts = textFile.flatMap(_.split(" "))
  .map(word => (word, 1))
  .reduceByKey(_ + _)
counts.collect().foreach(println)
// 或者写结果回 HDFS
counts.saveAsTextFile("hdfs://master:9000/spark/output/result")
bash
# 3. 查看结果
hdfs dfs -cat /spark/output/result/part-00000

7.4 spark-submit 提交详解 ​

bash
spark-submit \
  --class 主类名 \
  --master spark://master:7077 \
  --deploy-mode client \        # client: Driver 跑在提交机;cluster: Driver 跑在集群
  --executor-memory 2g \        # 每个 Executor 内存
  --total-executor-cores 6 \    # 总核数
  --conf spark.default.parallelism=6 \
  应用jar包 [参数...]
参数说明
--masterspark://host:7077(Standalone)、yarn、k8s://、local[*]
--deploy-modeclient(默认)/ cluster
--executor-memory每个 Executor 内存,默认 1g
--driver-memoryDriver 内存
--total-executor-cores总核数
--class主类(Java/Scala 应用)
--jars额外依赖包,逗号分隔

⚠️ 教学提示:--master local[*] 是本地模式(单机跑),spark://master:7077 才是提交到集群。学生经常混用这两个,注意区分。


八、排错指南 ​

报错原因解决
Could not resolve hostname master/etc/hosts 没配或配错检查所有节点 hosts,包含所有节点
Failed to connect to masterMaster 没启动 / 端口不对 / 防火墙确认 Master 进程、7077 端口、关防火墙
JAVA_HOME is not set环境变量没生效source /etc/profile,检查每台机器
start-all.sh: command not found与 Hadoop 脚本冲突用 /usr/local/spark/sbin/start-all.sh 全路径
Worker 注册不上(日志 Connection refused)Master 未启动或 hosts 不一致先启动 Master,检查 hosts 和免密
Slaves file does not exist用了 slaves 文件名3.x 用 workers 文件
Incompatible clusterIDs重复格式化 NameNode删所有节点数据目录重新格式化
8080 端口被占用其他服务占用改 SPARK_MASTER_WEBUI_PORT
Container exited with a non-zero exit codeExecutor 内存不足 / OOM调大 executor-memory,或调小数据量
Address already in use: 7077Master 重复启动先停掉旧 Master 进程
Worker 一直显示 DeadWorker 进程被杀(内存给满)调低 SPARK_WORKER_MEMORY,重启
Permission denied (publickey)免密没配好重新 ssh-copy-id,检查权限 700/600
Python 版本报错(pyspark 时)PySpark 与 Python 版本不匹配Spark 3.5 支持 Python 3.8+,确认版本

通用排查流程(三步法) ​

bash
# 1. 看进程
jps

# 2. 看日志(最重要)
tail -f /usr/local/spark/logs/*.log

# 3. 看端口
ss -tlnp | grep -E '7077|8080|8081'

💡 日志是排错的第一现场:Spark 的日志在 $SPARK_HOME/logs/ 下,master 和 worker 各有独立日志文件。报错先看日志,不要瞎猜。


九、面试高频考点 ​

概念类 ​

Q1:Spark 的部署模式有哪几种? A:本地模式(local)、Standalone(Spark 自带集群)、YARN 模式、K8s 模式、Mesos 模式(已移除)。教学常用 Standalone,生产常用 YARN/K8s。

Q2:Standalone 模式下 Master 和 Worker 分别负责什么? A:Master 负责资源管理和任务调度(接收 Worker 心跳、分配任务);Worker 负责执行任务(管理 Executor、汇报状态)。

Q3:Spark 集群中 Executor 和 Worker 什么关系? A:Worker 是 Standalone 集群的物理节点角色;Executor 是应用运行时的计算进程,运行在 Worker 上,一个 Worker 可以运行多个 Executor(由 --executor-memory 等参数决定)。

原理类 ​

Q4:为什么 spark-submit 要指定 --master? A:指定资源管理器地址。不同值对应不同模式:local[*] 本地、spark://host:7077 Standalone、yarn YARN、k8s:// Kubernetes。不指定则用 spark-defaults.conf 里的 spark.master。

Q5:--deploy-mode client 和 cluster 的区别? A:client 模式 Driver 跑在提交任务的机器上(便于看日志,教学常用);cluster 模式 Driver 跑在集群中(适合生产,提交后客户端可以断开)。

实操类 ​

Q6:搭建 Spark 集群的完整步骤? A:规划主机名和 IP → 配 hosts → 关防火墙/SELinux → 时间同步 → 装 JDK → 配 SSH 免密 → 解压 Spark → 配 spark-env.sh 和 workers → 分发到从节点 → start-all.sh 启动 → jps 验证 → SparkPi 验收。

Q7:集群搭建后如何验证成功? A:① jps 看到 Master+Worker 进程 ② Master 8080 页面看到所有 Worker Alive ③ spark-submit 跑通 SparkPi ④ 跑通 WordCount(读写 HDFS)。

Q8:Worker 启动失败怎么排查? A:① 看 Worker 日志($SPARK_HOME/logs/)② 检查 master 是否启动 ③ 检查免密 ④ 检查 workers 文件 ⑤ 检查内存配置是否超过机器实际内存。


十、附录 ​

10.1 常用命令速查 ​

命令作用
/usr/local/spark/sbin/start-all.sh启动 Master + 所有 Worker
/usr/local/spark/sbin/stop-all.sh停止所有
/usr/local/spark/sbin/start-master.sh只启动 Master
/usr/local/spark/sbin/start-workers.sh启动所有 Worker
/usr/local/spark/sbin/start-history-server.sh启动 History Server
spark-shell --master spark://master:7077启动 Scala Shell
pyspark --master spark://master:7077启动 Python Shell
spark-submit --master spark://master:7077 --class 主类 jar 参数提交任务
jps查看 Java 进程

10.2 停止顺序(与启动相反) ​

bash
# 先停 Spark
/usr/local/spark/sbin/stop-all.sh

# 再停 HDFS
stop-dfs.sh

10.3 Spark 4.x 安装差异(2026 最新版) ​

差异点Spark 3.5.xSpark 4.x
默认 Scala2.12(可选 2.13)2.13(停止支持 2.12)
预构建包名spark-3.5.x-bin-hadoop3spark-4.2.0-bin-hadoop3(Hadoop 3.4+)
JDK 要求8/11/1717 起步(JDK 8 不再支持)
安装步骤本教程相同,只是包名和 JDK 版本不同
新特性—更快的 SQL(向量化)、更好的 K8s 支持、Structured Streaming 增强

⚠️ 升级到 Spark 4 前检查:JDK 必须是 17+;Scala 2.12 的依赖要重编译;老配置项可能有变化。

10.4 推荐版本组合(直接照抄) ​

CentOS 7.9
JDK 1.8.0_461
Hadoop 3.3.6
Spark 3.5.1-bin-hadoop3(Scala 2.12)

这是当前主流教材和教学环境最稳的组合,与《Spark大数据技术与应用(第3版)》一致。想体验新特性可以单独搭一套 Spark 4.2.0 + JDK 17 的沙箱。


教程版本:V1.0 最后更新:2026-09-06 适用:CentOS 7/8 虚拟机集群教学环境

基于 Vite 强力驱动 | 纯静态轻量托管