PySpark通过JDBC读取RDS MySQL报通信链路故障如何解决?
PySpark JDBC连接RDS MySQL通信失败解决方案
pymysql可正常连接说明网络、安全组、账号权限均无异常,问题出在JDBC驱动配置层面,可按以下步骤逐一排查修正:
1. 修正JDBC连接参数,补充必要的驱动配置
当前将用户名密码直接写在URL的方式对MySQL CJ驱动兼容性不佳,同时缺少必要的时区、SSL相关参数,修改代码如下:
spark = SparkSession.builder.config("spark.jars", mysql_jar) \ .master("local[*]").appName("PySpark_MySQL_test").getOrCreate() df= spark.read.format("jdbc")\ .option("url", "jdbc:mysql://hostname.amazonaws.com:1150/dbname?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true") \ .option("driver", "com.mysql.cj.jdbc.Driver")\ .option("dbtable", "table_name")\ .option("user", "user_name")\ .option("password", "password")\ .load()
核心参数说明:
useSSL=false:RDS如果没有强制开启SSL验证,关闭SSL可避免驱动默认的SSL握手失败问题,若需使用SSL连接替换为useSSL=true&requireSSL=true即可serverTimezone:CJ驱动强制要求指定时区,和RDS实例时区保持一致即可,国内常用Asia/Shanghai,也可填UTCallowPublicKeyRetrieval=true:避免密码验证阶段的公钥获取失败报错- 用户名密码单独通过option传递,避免URL解析错误
2. 检查MySQL驱动版本兼容性
使用的mysql-connector-javajar包版本需要和RDS MySQL版本匹配:
- 若RDS MySQL为5.7版本,建议使用
mysql-connector-java-5.1.49.jar,此时驱动类需改为com.mysql.jdbc.Driver - 若RDS MySQL为8.0及以上版本,建议使用
mysql-connector-java-8.0.30.jar,驱动类用com.mysql.cj.jdbc.Driver
不要使用过高或过低的驱动版本,避免版本不兼容导致的通信失败。
3. 验证Spark环境的jar包加载是否正常
可在初始化SparkSession之后加一行验证代码,确认jar包是否正确加载:
print(spark.sparkContext.getConf().get("spark.jars"))
确认输出路径和实际mysql jar包路径一致,避免路径写错导致驱动未加载的问题。
内容的提问来源于stack exchange,提问作者Atif
相关产品推荐
相关产品推荐

