结论:不用装 spark 二进制包也能跑 pyspark,因 pyspark 包自带轻量级本地引擎(含 jars/ 和 python/pyspark/),但必须调用 findspark.init()(可不传参)将其路径动态注入 sys.path;否则 jvm 找不到 spark-sql_2.12-*.jar 等类,导致 sparksession 创建静默失败或报 classnotfoundexception。

直接说结论:不用装 Spark 二进制包也能跑 PySpark,但必须用 pyspark 包自带的本地引擎 + findspark 正确注册路径;否则 SparkSession.builder.master("local") 会静默失败或报 ClassNotFoundException。
为什么 import pyspark 成功却创建不了 SparkSession?
常见现象是执行 spark = SparkSession.builder.master("local").getOrCreate() 后卡住、无输出,或抛出 java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession。根本原因不是 Python 没导入,而是 JVM 找不到 Spark 的 Java 类 —— pyspark 包只含 Python 接口,不带 Spark 运行时(spark-sql_2.12-*.jar 等)。
- 如果你用
pip install pyspark安装,默认已包含轻量级本地 Spark 引擎(位于site-packages/pyspark/jars/),此时findspark.init()可以不传路径,但必须调用 - 如果你手动解压了官方 Spark 二进制包(如
/opt/spark-3.5.0),就必须显式传入路径:findspark.init('/opt/spark-3.5.0'),且该路径下要有python/pyspark/和jars/目录 - 漏掉
findspark.init()是最常踩的坑——它本质是把$SPARK_HOME/python和$SPARK_HOME/python/lib/py4j-*.zip动态加进sys.path,没这步,Python 层能 import,JVM 层完全失联
findspark.init() 之后还报 No module named 'py4j'?
这是 py4j 版本不匹配的典型症状。PySpark 对 py4j 有严格版本要求(例如 pyspark==3.5.0 要求 py4j==0.10.9.8),而 pip 可能装错版本。
- 先查当前 pyspark 带的 py4j 版本:
python -c "from pyspark import __version__; print(__version__)"; ls $(python -c "import pyspark; print(pyspark.__file__[:pyspark.__file__.rfind('/')])")/lib/ - 强制重装匹配版:
pip install --force-reinstall --no-deps py4j==0.10.9.8(替换成你 pyspark 对应的实际版本) - 不要用
conda install pyspark后再 pip 装 py4j —— conda 会锁死依赖,混用易冲突
怎么让 Jupyter 自动加载 SparkSession,不用每次写 findspark.init()?
可以配置 IPython startup 脚本,但要注意顺序和作用域 —— 必须在 kernel 启动早期执行,且不能依赖用户 Cell 的执行顺序。
- 找到 IPython 配置目录:
python -m IPython profile locate default(通常为~/.ipython/profile_default/) - 在
startup/子目录下新建00-pyspark-init.py(文件名前缀数字确保优先执行) - 内容仅两行:
import findspark findspark.init()
(如果 Spark 路径非默认,补上参数如findspark.init('/opt/spark')) - 重启 Jupyter Notebook,新打开的 notebook 就自动 ready,但旧 notebook 需重启 kernel 才生效
远程集群连接失败,master="yarn" 或 "spark://host:7077" 不起作用?
本地 Jupyter 默认只能连 local 模式。要连远程集群,必须满足三个硬条件:
- 你的机器能直连集群节点的端口(如 YARN ResourceManager 的 8088、Spark Master 的 7077),防火墙和网络策略要放行
- 集群客户端配置已就位:
HADOOP_CONF_DIR和YARN_CONF_DIR环境变量必须指向含core-site.xml、yarn-site.xml的目录,且这些 XML 里 host 名不能是内网别名(如hadoop-master),得是 IP 或公网可解析域名 - SparkSession 构建时显式指定依赖:
spark = SparkSession.builder \ .master("yarn") \ .config("spark.hadoop.fs.defaultFS", "hdfs://192.168.1.100:9000") \ .config("spark.yarn.jars", "hdfs://192.168.1.100:9000/spark-jars/*") \ .getOrCreate()(spark.yarn.jars必须指向 HDFS 上预上传的 jar 包,不能用本地路径)
真正容易被忽略的是:所有配置项(尤其是 spark.yarn.jars)必须在 .getOrCreate() 前完成,且一旦 Session 创建,后续 .config() 调用无效。











