py4j.protocol.Py4JJavaError: An error occurred while calling o156.save. : java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
时间: 2025-06-16 15:27:19 浏览: 25
### 错误分析与解决方案
`py4j.protocol.Py4JJavaError: An error occurred while calling o30.jdbc.` 和 `java.lang.ClassNotFoundException: com.mysql.jdbc.Driver` 的错误通常出现在使用 PySpark 通过 JDBC 连接 MySQL 数据库时。此错误表明系统无法找到 MySQL 驱动程序的类 `com.mysql.jdbc.Driver`,这可能是由于以下原因之一:
1. **MySQL 驱动未正确加载**:驱动程序的 JAR 文件未添加到 Spark 的类路径中。
2. **驱动版本不兼容**:MySQL 驱动版本与 Java 或 Spark 版本不兼容。
3. **配置错误**:`spark.driver.extraClassPath` 和 `spark.executor.extraClassPath` 配置未正确设置。
以下是详细的解决方案[^1]。
---
### 解决方案
#### 1. 确保 MySQL 驱动已下载并正确配置
下载适用于 MySQL 的 JDBC 驱动程序 JAR 文件(例如 `mysql-connector-java-8.0.20.jar`),并将其放置在 Spark 的类路径中。可以通过以下方式配置:
- 在启动 Spark 作业时,使用 `--jars` 参数指定驱动程序路径:
```bash
spark-submit --jars /path/to/mysql-connector-java-8.0.20.jar your_script.py
```
- 或者,在 Spark 配置文件中设置 `spark.driver.extraClassPath` 和 `spark.executor.extraClassPath`:
```properties
spark.driver.extraClassPath=/path/to/mysql-connector-java-8.0.20.jar
spark.executor.extraClassPath=/path/to/mysql-connector-java-8.0.20.jar
```
确保路径正确且驱动程序文件存在[^3]。
---
#### 2. 检查驱动版本与 Java 兼容性
从 MySQL 8.0 开始,推荐使用的驱动类为 `com.mysql.cj.jdbc.Driver` 而不是 `com.mysql.jdbc.Driver`。如果使用的是 MySQL 8.x 驱动,请更新代码中的驱动类名称[^5]:
```python
property = {
'user': '***',
'password': '***',
'driver': 'com.mysql.cj.jdbc.Driver' # 更新为新驱动类
}
```
此外,确保 Java 版本与 MySQL 驱动兼容。例如,MySQL 8.x 驱动需要 Java 8 或更高版本。
---
#### 3. 验证 Spark 配置
如果使用的是 SparkSession,则需要确保所有配置正确加载。以下是一个完整的示例代码[^5]:
```python
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder \
.appName('mysql-test') \
.master('local') \
.config("spark.driver.extraClassPath", "/path/to/mysql-connector-java-8.0.20.jar") \
.config("spark.executor.extraClassPath", "/path/to/mysql-connector-java-8.0.20.jar") \
.getOrCreate()
url = 'jdbc:mysql://localhost:3306/db'
property = {
'user': 'root',
'password': 'password',
'driver': 'com.mysql.cj.jdbc.Driver' # 使用正确的驱动类
}
df = spark.read.jdbc(url=url, table='your_table', properties=property)
df.show()
spark.stop()
```
---
#### 4. 检查日志以定位问题
如果上述步骤仍未解决问题,可以检查 Spark 日志以获取更多详细信息。日志路径通常位于 `$SPARK_HOME/logs` 目录下。重点查看是否有其他依赖冲突或路径错误的提示[^2]。
---
### 注意事项
- 如果使用的是 YARN 模式,请确保 MySQL 驱动程序也分发到所有节点。
- 如果使用的是 Docker 或 Kubernetes,请将 MySQL 驱动程序挂载到容器中,并确保路径正确。
---
阅读全文
相关推荐


















