spark在linux上成功运行需满足三要素:java版本匹配(jdk 8或11)、spark_home与path正确配置($spark_home/bin须置path最前)、spark-env.sh至少配置java_home和spark_master_host;缺一即导致spark-shell启动失败或分布式功能异常。

Spark 在 Linux 上不是“一键安装”的软件,它依赖 Java、路径配置和启动逻辑,缺一环就起不来。装完 spark-shell 能跑不等于集群能用,本地模式通 ≠ 分布式模式通。
Java 版本必须匹配 Spark 要求
Spark 3.3+ 官方只支持 JDK 8 或 JDK 11(JDK 17 尚未被完全认证)。用 JDK 17 启动 spark-shell 可能报 UnsupportedClassVersionError;用 JDK 17 编译的 Scala 库也可能导致 java.lang.NoClassDefFoundError: scala/Function1。
- 检查当前 JDK:
java -version,确认输出含1.8.0_或11. - 如果系统默认是 JDK 17,别改全局
JAVA_HOME,只在spark-env.sh中显式指定:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64(路径按实际调整) - Spark 二进制包里自带的
bin/spark-class脚本会读JAVA_HOME,不走系统java命令别名
选对预编译包,别碰源码编译
官网下载页标着 “Pre-built for Apache Hadoop 3.x” 的包才是开箱即用的。选错会导致运行时报 ClassNotFoundException: org.apache.hadoop.fs.FileSystem,尤其当你打算读 HDFS 或 S3。
- 典型正确包名:
spark-3.5.0-bin-hadoop3.tgz(不含 “with-hadoop” 或 “src” 字样) - 如果没用 Hadoop,选
hadoop3包也完全没问题——它只是带了 Hadoop client jar,不启动 HDFS 也不会加载 - 绝对避免下载
spark-3.5.0.tgz(源码包),它没有lib目录,spark-shell直接报No such file or directory
spark-env.sh 必须手动创建并赋值
解压后 $SPARK_HOME/conf/spark-env.sh 默认不存在,只有 spark-env.sh.template。不重命名+编辑,start-master.sh 会静默失败,spark-submit 也无法识别 Master 地址。
- 先复制:
cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh - 至少填这两行(单机测试):
export JAVA_HOME=/path/to/jdk和export SPARK_MASTER_HOST=localhost - 若机器 hostname 解析异常(比如
hostname -f返回空或非法域名),必须加export SPARK_LOCAL_IP=127.0.0.1,否则 Worker 注册失败
验证不能只靠 spark-shell
spark-shell 成功只说明 driver 进程起来了,不代表分布式能力可用。真正验证得看 Web UI 和 Worker 是否注册成功。
- 启动 Master:
$SPARK_HOME/sbin/start-master.sh,然后访问http://localhost:8080—— 页面左上角应显示ALIVE状态 - 再启动 Worker:
$SPARK_HOME/sbin/start-worker.sh spark://localhost:7077,刷新 Web UI,Workers 列表应出现一条记录 - 运行一个带 executor 的任务:
spark-submit --master spark://localhost:7077 --deploy-mode client --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_*.jar 10,观察 Web UI 的 Executors 标签页是否出现 executor 进程
最容易被忽略的是 workers 文件(Spark 3.0+ 已弃用 slaves):哪怕只起一个 Worker,也要确保 $SPARK_HOME/conf/workers 存在且内容为 localhost,否则 start-all.sh 不会拉起任何 Worker。











