2016-07-22 73 views
0

我從Spark發行版中的示例(v1.6.2)開始。我添加了自己的「Hello World」示例,並且工作正常。嘗試添加使用第三方的依賴(com.google.cloud:gcloud-java-nio:0.2.5)的東西,這裏是發生了什麼:添加依賴項時出現Spark/Java NoClassDefFoundError

16/07/22 13:05:26 ERROR SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[Executor task launch worker-7,5,main] java.lang.NoClassDefFoundError: org/spark-project/guava/base/MoreObjects at com.google.cloud.ServiceOptions.activeGoogleCloudConfig(ServiceOptions.java:282) at com.google.cloud.ServiceOptions.googleCloudProjectId(ServiceOptions.java:294) at com.google.cloud.ServiceOptions.defaultProject(ServiceOptions.java:270) at com.google.cloud.ServiceOptions.(ServiceOptions.java:206) at com.google.cloud.HttpServiceOptions.(HttpServiceOptions.java:153) at com.google.cloud.storage.StorageOptions.(StorageOptions.java:69) (...)

我跑我的代碼如下:

spark-1.6.2$ mvn -DskipTests clean package 
(lots of time passes...) 
spark-1.6.2$ ./bin/run-example JavaGcsTest 

,並增加我說那些行examples/pom.xml的依賴:

<dependency> 
    <groupId>com.google.cloud</groupId> 
    <artifactId>gcloud-java-nio</artifactId> 
<version>0.2.5</version> 
</dependency> 

看起來根本原因是,無論gcloud-Java的NiO和星火取決於番石榴,也許它們依賴於不同版本的。

我看着相關的問題,答案建議做一個胖罐子。不過,我不確定如何在這裏應用,因爲已經將示例捆綁到一個胖罐子中(examples/target/scala-2.10/spark-examples-1.6.2-hadoop2.2.0.jar)。

我試着改變使用的番石榴的版本,將它從14提高到19(最新),但是當然編譯失敗(SparkEnv.scala:84:類MapMaker中的方法softValues無法在com中訪問.google.common.collect.MapMaker)。

希望有人對如何讓Spark與第三方圖書館合作提出建議!

回答

0

解決此問題的一種方法是編譯第三方庫的陰影版本並將該jar用作依賴項。

在gcloud-java-nio的情況下,該項目已經包含陰影罐子目標,因此在運行mvn package之後它已在target/gcloud-java-nio-0.2.7-SNAPSHOT-shaded.jar中。

相關問題