PySpark从Snowflake加载数据出现BouncyCastle类缺失报错
为什么会报这个错
报错指向的缺失类是net.snowflake.client.jdbc.internal.org.bouncycastle.jce.provider.BouncyCastleProvider,属于Snowflake JDBC自己内部重打包的私有类,包路径和公开的Bouncy Castle依赖完全不一样。
之前手动加公开版BC依赖、把BC注册成JDK全局安全提供者这些操作全是无效的——类路径根本对不上,写再多配置也加载不到。
你说升级Big Sur之后才出的问题,其实和系统本身兼容性没关系,是系统升级改了文件权限,导致原来存在本地~/.m2目录下的Snowflake jar读取异常,要么是文件权限不够被类加载器跳过,要么是缓存的jar本身就缺了内部的类片段,才突然报类找不到。
能直接落地的解决步骤
第一步:清掉损坏的本地依赖缓存
这是80%同类问题的根因:
- 先把所有正在运行的PySpark进程全部停掉
- 执行命令删掉本地缓存的残缺Snowflake包:
重新跑之前的PySpark代码即可,框架会自动从中央仓库拉完整的Snowflake JDBC和Spark-Snowflake驱动jar,缺失的BC类自然会被正常加载。rm -rf ~/.m2/repository/net/snowflake/
第二步:调整依赖配置,避免版本冲突
如果清完缓存还报错,就把原来的spark.jars.packages配置改成下面的内容,别乱改版本号——这里加的BC版本必须和Snowflake JDBC 3.12.17内置的版本完全匹配,不然还是会触发冲突:
conf.set('spark.jars.packages', 'net.snowflake:spark-snowflake_2.11:2.8.4-spark_2.4,' 'net.snowflake:snowflake-jdbc:3.12.17,' 'org.bouncycastle:bcprov-jdk15on:1.65,' 'org.bouncycastle:bcpkix-jdk15on:1.65' )
再加一行配置,关掉Spark的依赖仲裁机制,避免其他组件带的旧BC包把Snowflake的内部类顶掉:
conf.set('spark.jars.ivy', '-Divy.dep.configuration.resolve.constraint=ignore')
这些无效操作别再做了,纯浪费时间
- 别把BC包塞到JDK的
jre/lib/security目录下,Snowflake根本不读JDK全局注册的安全提供者,这么做不仅没用,还可能引出SSL握手的新问题 - 别随便升级Spark-Snowflake和Snowflake JDBC的版本,你现在用的2.8.4-spark_2.4 + 3.12.17是Spark2.4生态里官方验证过的稳定组合,乱升级反而容易出更多类不兼容的问题
验证是否修复
Spark启动完成后跑一行代码,确认依赖是不是加载全了:
jars = spark.sparkContext._jsc.sc().listJars() print([j.toString() for j in jars if 'snowflake-jdbc' in j.toString()])
只要输出里能看到snowflake-jdbc-3.12.17.jar的路径,就说明依赖加载正常,之前的报错会直接消失。
内容的提问来源于stack exchange,提问作者Charlie A
相关产品推荐
相关产品推荐

