我从Spark发行版(v1.6.2)中的示例开始。我添加了自己的" Hello World"例子,这很好。尝试添加使用第三方依赖项的内容(com.google.cloud:gcloud-java-nio:0.2.5),会发生以下情况:
16/07/22 13:05:26错误SparkUncaughtExceptionHandler:未捕获 线程中的异常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) 在 com.google.cloud.ServiceOptions.googleCloudProjectId(ServiceOptions.java:294) 在 com.google.cloud.ServiceOptions.defaultProject(ServiceOptions.java:270) 在com.google.cloud.ServiceOptions。(ServiceOptions.java:206) 在 com.google.cloud.HttpServiceOptions。(HttpServiceOptions.java:153) 在 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和Spark都依赖于guava,也许它们依赖于它的不同版本。
我查看了相关问题,答案建议制作一个胖罐子。我不知道如何在这里应用它,因为示例已经捆绑在一个胖罐子里(examples/target/scala-2.10/spark-examples-1.6.2-hadoop2.2.0.jar
)。
我尝试更改使用的番石榴版本,将其从14增加到19(最新版本),但当然编译失败(SparkEnv.scala:84:无法在com中访问MapMaker类中的方法softValues。 google.common.collect.MapMaker)。
希望有人就如何让Spark与第三方图书馆合作提出建议!
答案 0 :(得分:0)
摆脱这个问题的一种方法是编译第三方库的着色版本并使用该jar作为依赖项。
对于gcloud-java-nio,项目已经包含一个阴影jar目标,所以在mvn package
运行target/gcloud-java-nio-0.2.7-SNAPSHOT-shaded.jar
之后。