java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()異常解決思路
通過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,但後來到各個機器上執行的時候依然報錯,索性放那沒解決。如果大家有什麼好的方法,歡迎指教