pyspark能否正常运行取决于java、spark和python三者版本严格匹配:必须使用jdk 8(java -version显示1.8)、spark 3.x对应版本的预编译包(如spark-3.5.3-bin-hadoop3)、pyspark同版本pip安装,并将mysql等jdbc驱动以jar形式通过spark.jars或spark.jars.packages显式加载。

PySpark 能否跑起来,不取决于你装了多少库,而取决于 Java、Spark 和 Python 三者是否对得上号。JDK 版本错、SPARK_HOME 没设对、驱动 JAR 漏掉一个字节,都会在 spark.read.jdbc 或 spark.createDataFrame 时突然报错——而且错误信息往往只说“class not found”或“no suitable driver”,根本看不出是哪一环断了。
确认 JDK 8 是当前系统默认 Java 版本
Spark 3.x(包括主流的 3.5.3)在 JDK 8 下最稳。JDK 11+ 虽然能启动,但容易在 JDBC 驱动加载、序列化、甚至 spark.sql.adaptive.enabled 开关上出兼容问题。
- 运行
java -version,输出必须含1.8.,不能是11.0.或17. - 如果系统有多个 JDK,用
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64(Linux)或对应路径硬指定,别依赖update-alternatives自动切换 -
spark-submit启动时会读取JAVA_HOME,不是PATH里的 java 命令
SPARK_HOME 和 PATH 必须显式配置
仅靠 pip install pyspark 不足以让 Spark 引擎工作——它只装了 Python 绑定层,底层 JVM 进程仍需真实 Spark 发行版支持。
- 下载预编译版 Spark(如
spark-3.5.3-bin-hadoop3.tgz),解压到固定路径,例如/opt/spark - 在 shell 配置中添加:
export SPARK_HOME=/opt/sparkexport PATH=$SPARK_HOME/bin:$PATH - 验证:
spark-shell --version应输出Spark version 3.5.3;which spark-submit必须指向$SPARK_HOME/bin/spark-submit - Python 里调
SparkSession.builder.master("local[2]").getOrCreate()时,若报No module named 'py4j',说明pyspark安装包和本地 Spark bin 不匹配,此时应卸载重装pyspark==3.5.3,而非升级
MySQL / PostgreSQL 等 JDBC 驱动不能只 pip install
pip install mysql-connector-python 对 PySpark 完全无效——JVM 进程根本不认 Python 的 wheel。驱动必须以 JAR 形式交给 Spark 的 classpath。
- 手动下载对应版本 JAR:MySQL 推荐
mysql-connector-java-8.0.26.jar,PostgreSQL 用postgresql-42.6.0.jar - 两种加载方式选其一:
– 启动时用.config("spark.jars", "/path/to/mysql-connector-java-8.0.26.jar")
– 或更稳妥的远程方式:.config("spark.jars.packages", "mysql:mysql-connector-java:8.0.26")(Spark 自动从 Maven 中央仓库拉取) - 注意:JDBC URL 中的
jdbc:mysql://...协议名必须和 JAR 包内 driver 类名一致;mysql-connector-java的 driver 类是com.mysql.cj.jdbc.Driver,旧版5.1.x是com.mysql.jdbc.Driver,不匹配就会报No suitable driver
本地开发慎用 local[*],分区数和内存要手动调
很多人写 .master("local[*]") 图省事,结果 16 核机器跑一个 df.groupBy("id").count() 就卡死——因为默认 spark.sql.shuffle.partitions=200,产生 200 个任务,但每个 task 默认只分到 1GB 内存,小数据量反而因调度开销变慢。
- 开发机建议写死核心数:
.master("local[4]"),再配.config("spark.sql.shuffle.partitions", "8") -
spark.driver.memory和spark.executor.memory在 local 模式下其实是一个进程,设太高会 OOM,设太低会频繁 GC;16G 内存机器推荐"4g"起步 - 读 CSV/JSON 时加
inferSchema=True很方便,但数据列多、样本杂时极易推错类型(比如把"123"当 string,"123.0"当 double),后续 join 失败;生产代码务必显式传schema=StructType([...])
spark-3.5.3-bin-hadoop3.tgz,那配套的 hadoop-client 是 3.3.x,此时若 JDBC 驱动里间接依赖了 hadoop-common 2.7.x,就可能在 S3A 文件系统或 Kerberos 认证环节静默失败——这种问题不会报错,只会让 df.write.parquet("s3a://...") 一直 hang 住。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











