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 长期维护系列)
目录
- 一、安装前规划
- 二、基础环境准备(所有节点)
- 三、SSH 免密登录
- 四、Hadoop 安装(可选但推荐)
- 五、Spark 安装与配置
- 六、启动集群与验证
- 七、运行第一个 Spark 程序
- 八、排错指南
- 九、面试高频考点
- 十、附录
一、安装前规划
1.1 集群节点规划
| 节点 | IP(示例) | 角色 | 建议内存 | 建议 CPU |
|---|---|---|---|---|
| master | 192.168.128.130 | Master(调度) + Worker(计算) | 4G+ | 4 核 |
| slave1 | 192.168.128.131 | Worker(计算) | 4G+ | 4 核 |
| slave2 | 192.168.128.132 | Worker(计算) | 4G+ | 4 核 |
💡 命名与 IP 原则:
- 主机名建议用
master、slave1、slave2,简洁好记,与教材一致- IP 用静态 IP,不要用 DHCP 自动分配(重启后 IP 变化会导致集群配置失效)
- 教学环境内存不够时,可以 3 台各 2G,但 Worker 内存(SPARK_WORKER_MEMORY)要相应调低
1.2 软件版本对照
| 软件 | 版本 | 说明 |
|---|---|---|
| Linux | CentOS 7.x / 8.x | 教学环境最常用;Ubuntu 22.04 也可以 |
| JDK | 1.8.0_xxx | Spark 3.x 官方要求 JDK 8/11/17,教学用 JDK 8 最稳 |
| Hadoop | 3.3.x | Standalone 模式可选;要读写 HDFS 才需要 |
| Spark | 3.5.x | 预构建包:spark-3.5.x-bin-hadoop3 或 -scala2.13 |
| Scala | 2.12 / 2.13 | Spark 自带,不用单独装 |
⚠️ 版本匹配是最大的坑:
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 端口规划
| 端口 | 用途 | 配置文件 |
|---|---|---|
| 7077 | Spark Master 通信端口(类似 YARN 的 8032) | spark-env.sh 的 SPARK_MASTER_PORT |
| 8080 | Spark Master Web UI | spark-env.sh 的 SPARK_MASTER_WEBUI_PORT |
| 8081 | Spark Worker Web UI | spark-env.sh 的 SPARK_WORKER_WEBUI_PORT |
| 4040 | 每个 Driver 的 SparkContext Web UI(动态) | spark-defaults.conf |
| 18080 | Spark History Server | spark-defaults.conf |
| 8020/9000 | HDFS NameNode(若装 Hadoop) | core-site.xml |
⚠️ 8080 常被其他服务占用(如 Linux 的 web 管理工具),被占用时改 SPARK_MASTER_WEBUI_PORT。
二、基础环境准备(所有节点)
以下命令在 3 台机器上都要执行(除非特别说明只在 master 上做)。
2.1 修改主机名
# 修改主机名(master 节点)
hostnamectl set-hostname master
# slave1 节点
hostnamectl set-hostname slave1
# slave2 节点
hostnamectl set-hostname slave2
# 验证
hostname2.2 配置 /etc/hosts(所有节点,内容相同)
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(实验环境强烈建议)
# 关闭防火墙
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 时间同步
# 安装 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 安装(推荐)
# 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 解压安装
mkdir -p /usr/local/java
tar -zxvf jdk-8u461-linux-x64.tar.gz -C /usr/local/java
# 配置环境变量
vi /etc/profile# 文件末尾追加
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# 生效并验证
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 上操作)
# 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 hostname3.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 上,然后分发)
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. 配置环境变量(所有节点)
vi /etc/profileexport HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATHsource /etc/profile
hadoop version3. 修改配置文件($HADOOP_HOME/etc/hadoop/)
hadoop-env.sh:
export JAVA_HOME=/usr/local/java/jdk1.8.0_461core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>hdfs-site.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
slave24. 格式化 NameNode(只在 master,只做一次)
hdfs namenode -format5. 启动 HDFS
start-dfs.sh
jps预期进程:
| 节点 | 应出现的进程 |
|---|---|
| master | NameNode、DataNode、SecondaryNameNode |
| slave1 | DataNode |
| slave2 | DataNode |
⚠️ 格式化只能做一次:重复格式化会导致 DataNode 和 NameNode 的 clusterID 不一致,报
Incompatible clusterIDs错误。要重来就删掉所有节点的 namenode/datanode 数据目录再格式化。
6. 验证 HDFS
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 版)国内镜像(下载快)
# 清华镜像
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.tgz5.2 解压与目录规划
cd /usr/local
tar -zxvf spark-3.5.1-bin-hadoop3.tgz
mv spark-3.5.1-bin-hadoop3 sparkSpark 目录结构说明
| 目录/文件 | 作用 |
|---|---|
| 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 分发到从节点
scp -r /usr/local/spark slave1:/usr/local/
scp -r /usr/local/spark slave2:/usr/local/⚠️ 也可以每个节点单独下载解压,但 scp 分发更快且保证版本一致。
5.4 配置环境变量(所有节点)
vi /etc/profileexport SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATHsource /etc/profile5.5 修改配置文件
文件 1:spark-env.sh(核心)
cd /usr/local/spark/conf
cp spark-env.sh.template spark-env.sh
vi spark-env.sh# 文件末尾追加:
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_HOST | Master 所在主机名 | 必须和 hosts 一致 |
| SPARK_MASTER_PORT | Master 通信端口 | 默认 7077 |
| SPARK_WORKER_CORES | 每个 Worker 可用 CPU 核数 | 不要超过机器实际核数 |
| SPARK_WORKER_MEMORY | 每个 Worker 可用内存 | 留出系统余量,如 4G 机器给 3g |
| SPARK_WORKER_WEBUI_PORT | Worker 页面端口 | 默认 8081 |
⚠️ 内存别给满:
SPARK_WORKER_MEMORY给满会导致系统 OOM,Worker 直接被系统杀掉。4G 虚拟机给 3g,留 1G 给操作系统。
文件 2:workers(从节点列表)
cd /usr/local/spark/conf
cp workers.template workers
vi workers# 删除 localhost,改为:
master
slave1
slave2⚠️ 旧版叫 slaves,3.0+ 改名 workers:网上很多教程还在写 slaves,3.5.x 已经不支持 slaves 文件了,写错文件 Worker 一个都起不来。
文件 3:spark-defaults.conf(可选,推荐配置)
cp spark-defaults.conf.template spark-defaults.conf
vi spark-defaults.conf# 提交任务的默认参数
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(可选)
cp log4j2.properties.template log4j2.properties
# 将 INFO 改为 WARN,减少控制台刷屏5.6 分发配置到从节点
scp -r /usr/local/spark/conf/* slave1:/usr/local/spark/conf/
scp -r /usr/local/spark/conf/* slave2:/usr/local/spark/conf/六、启动集群与验证
6.1 启动顺序
# 如果有 Hadoop,先启动 HDFS(在 master 上)
start-dfs.sh
# 启动 Spark 集群(在 master 上执行)
start-all.sh⚠️
start-all.sh在装了 Hadoop 的环境可能被 Hadoop 的脚本覆盖,报找不到命令。此时用全路径或显式调用:bash/usr/local/spark/sbin/start-all.sh
手动启动(了解底层,排错用)
# 先启动 Master
/usr/local/spark/sbin/start-master.sh
# 再启动所有 Worker
/usr/local/spark/sbin/start-workers.sh6.2 验证进程
jps预期结果:
| 节点 | 进程 | 说明 |
|---|---|---|
| master | Master、Worker、(NameNode、DataNode) | Worker 因为 master 自己也参与计算 |
| slave1 | Worker、(DataNode) | |
| slave2 | Worker、(DataNode) |
💡 如果 master 上没看到 Worker,说明 workers 文件没配对或免密没通;如果 slave 上没看到 Worker,先看
$SPARK_HOME/logs/下的日志。
6.3 Web UI 验证
| 地址 | 内容 |
|---|---|
| http://master:8080 | Spark Master 页面:Worker 列表、运行中的应用、任务历史 |
| http://master:8081 | 某个 Worker 的详细信息(CPU/内存使用) |
| http://master:4040 | 正在运行应用的 SparkContext 页面(任务级 DAG) |
| http://master:18080 | History Server(历史任务日志,需单独启动) |
Master 页面关键信息:
- Workers:3 个,状态 Alive,显示每个 Worker 的核数和内存
- Running Applications:当前运行的任务
- Completed Applications:已完成任务
6.4 启动 History Server(可选)
# 需要先建 HDFS 目录
hdfs dfs -mkdir -p /spark-logs
# 启动
/usr/local/spark/sbin/start-history-server.sh
# 页面:http://master:18080七、运行第一个 Spark 程序
7.1 跑官方示例:计算 π
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 测试
# Scala 版
spark-shell --master spark://master:7077
# Python 版
pyspark --master spark://master:7077进入后测试:
val rdd = sc.parallelize(1 to 100, 4)
rdd.sum()
// res: Double = 5050.07.3 WordCount 完整测试(读 HDFS)
# 1. 准备数据(HDFS 已启动的情况下)
hdfs dfs -mkdir -p /spark/input
hdfs dfs -put /etc/hosts /spark/input/
# 2. 用 spark-shell 写 WordCount
spark-shell --master spark://master:7077val 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")# 3. 查看结果
hdfs dfs -cat /spark/output/result/part-000007.4 spark-submit 提交详解
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包 [参数...]| 参数 | 说明 |
|---|---|
| --master | spark://host:7077(Standalone)、yarn、k8s://、local[*] |
| --deploy-mode | client(默认)/ cluster |
| --executor-memory | 每个 Executor 内存,默认 1g |
| --driver-memory | Driver 内存 |
| --total-executor-cores | 总核数 |
| --class | 主类(Java/Scala 应用) |
| --jars | 额外依赖包,逗号分隔 |
⚠️ 教学提示:
--master local[*]是本地模式(单机跑),spark://master:7077才是提交到集群。学生经常混用这两个,注意区分。
八、排错指南
| 报错 | 原因 | 解决 |
|---|---|---|
Could not resolve hostname master | /etc/hosts 没配或配错 | 检查所有节点 hosts,包含所有节点 |
Failed to connect to master | Master 没启动 / 端口不对 / 防火墙 | 确认 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 code | Executor 内存不足 / OOM | 调大 executor-memory,或调小数据量 |
Address already in use: 7077 | Master 重复启动 | 先停掉旧 Master 进程 |
| Worker 一直显示 Dead | Worker 进程被杀(内存给满) | 调低 SPARK_WORKER_MEMORY,重启 |
Permission denied (publickey) | 免密没配好 | 重新 ssh-copy-id,检查权限 700/600 |
| Python 版本报错(pyspark 时) | PySpark 与 Python 版本不匹配 | Spark 3.5 支持 Python 3.8+,确认版本 |
通用排查流程(三步法)
# 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 停止顺序(与启动相反)
# 先停 Spark
/usr/local/spark/sbin/stop-all.sh
# 再停 HDFS
stop-dfs.sh10.3 Spark 4.x 安装差异(2026 最新版)
| 差异点 | Spark 3.5.x | Spark 4.x |
|---|---|---|
| 默认 Scala | 2.12(可选 2.13) | 2.13(停止支持 2.12) |
| 预构建包名 | spark-3.5.x-bin-hadoop3 | spark-4.2.0-bin-hadoop3(Hadoop 3.4+) |
| JDK 要求 | 8/11/17 | 17 起步(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 虚拟机集群教学环境