我從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與第三方圖書館合作提出建議!