java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()异常解决思路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengzheku/article/details/50688044

  通过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,但后来到各个机器上运行的时候依然报错,索性放那没解决。如果大家有什么好的方法,欢迎指教    

猜你喜欢

转载自blog.csdn.net/fengzheku/article/details/50688044