通过Spark-submit提交的任务抛出了java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()Ljava/util/Set的异常,去网上搜了一下解决思路,大概有以下几种方法,供大家参考下:
一、Guava低版本和高版本的冲突。newConcurrentHashSet这个方法是在Guava-15.0及更高版本中在出现的,如果你的程序中有其它的jar包依赖了低版本的guava,如guava-14.0等,你就需要此jar包找出来,并且把低版本的guava从此jar包中移除出去。
移除方法:假如是A jar包中依赖了低版本的guava,可以在pom文件中A jar下加入如下代码
<dependency>
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
p.s jar包依赖关系的查找:
1、Eclipse下直接打开pom文件,选择Dependency Hierarchy选项进行查看
2、Linux 下通过命令:mvn dependency:tree 来进行查看
二、 guava 版本和 google-collections冲突。 找到依赖google-collections的jar包,把依赖关系去掉。
移除方法:假如是A jar包中依赖了低版本的google-collections,可以在pom文件中A jar下加入如下代码
<dependency>
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
三、 Hadoop集群或者spark集群中的jar包的影响:这种情况是最难解决的一种情况,你可以通过此种方法打印出是哪个jar包导致的此错误
在你程序抛异常的那句话上面加上如下代码:
System.out.println("----------------------" + this.getClass().getResource("/com/google/common/collect/Sets.class"));
运行你的代码,会打印出含有Sets这个类的jar包,然后检查此jar包出现在何处,看是否可以去掉。去掉是最不好的一种方法。
题外话:我程序中的错误就是因为Spark提交任务后老是加载hadoop安装目录下的一个avro-tools-1.7.6-cdh5.5.0.jar的一个jar包,这个jar包我又没法去掉,本来想着在spark-defaults.conf 文件下加入这句话:spark.driver.extraClassPath=...../guava-17.0.jar,后来发现Spark程序刚启动的时候确实加载了Guava,但后来到各个机器上运行的时候依然报错,索性放那没解决。如果大家有什么好的方法,欢迎指教