Databricks Notebook调用Guava BloomFilter.writeTo报NoSuchMethodError求助
Guava BloomFilter
writeTo 方法 NoSuchMethodError 问题解决 核心原因
Databricks Runtime默认内置了旧版本的Guava,你手动添加的Guava依赖版本和集群内置版本不一致。编译阶段Notebook使用你指定的新版本(包含writeTo方法),但运行时JVM加载了集群内置的旧版本(无该方法),导致出现NoSuchMethodError。
解决步骤
确认集群内置Guava版本
在Notebook中执行代码查看当前集群的Guava版本:import com.google.common.util.concurrent.MoreExecutors println(MoreExecutors.getClass.getProtectionDomain.getCodeSource.getLocation)输出路径会包含Guava版本号,比如
guava-14.0.1.jar。注意:writeTo方法是Guava 23.0及以后版本才新增的,如果集群内置版本低于23.0,必须强制加载新版本。强制加载指定Guava版本
- 把你需要的高版本Guava jar上传到DBFS(通过Workspace的Data > DBFS页面上传)。
- 进入集群配置页面,在高级选项 > Spark > Spark配置中添加:
替换路径为你上传的jar的实际DBFS路径。spark.driver.extraClassPath /dbfs/path/to/your/guava-[version].jar spark.executor.extraClassPath /dbfs/path/to/your/guava-[version].jar - 重启集群。
验证加载结果
重启后执行以下代码,确认加载的是你指定的新版本Guava:import com.google.common.hash.BloomFilter println(BloomFilter.getClass.getProtectionDomain.getCodeSource.getLocation)输出路径应指向你上传的jar文件。
重新测试
writeTo方法
重新运行BloomFilter的创建和writeTo调用代码,此时应该可以正常执行。
另外,也可以用%sh命令查看集群类路径中的Guava位置:
echo $CLASSPATH | grep guava
确认旧版本Guava是否被优先级更高的路径加载。
内容的提问来源于stack exchange,提问作者tweetingReza
相关产品推荐
相关产品推荐

