![](/img/trans.png)
[英]Spark-submit in dataproc cluster generating java.lang.ClassNotFoundException:
[英]Running app jar file on spark-submit in a google dataproc cluster instance
我正在運行一個.jar文件,其中包含我需要打包的所有依賴項。 其中一個依賴項是com.google.common.util.concurrent.RateLimiter
並且已經檢查過它的類文件位於此.jar文件中。
不幸的是,當我在google的dataproc-cluster實例的主節點上點擊命令spark-submit時,我收到此錯誤:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
at com.google.common.util.concurrent.RateLimiter$SleepingStopwatch$1.<init>(RateLimiter.java:417)
at com.google.common.util.concurrent.RateLimiter$SleepingStopwatch.createFromSystemTimer(RateLimiter.java:416)
at com.google.common.util.concurrent.RateLimiter.create(RateLimiter.java:130)
at LabeledAddressDatasetBuilder.publishLabeledAddressesFromBlockstem(LabeledAddressDatasetBuilder.java:60)
at LabeledAddressDatasetBuilder.main(LabeledAddressDatasetBuilder.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:672)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:120)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
在覆蓋我的依賴關系的意義上似乎發生了一些事情。 已經從這個.jar反編譯了Stopwatch.class
文件並檢查了那個方法。 這恰好發生在我運行google dataproc實例時。 我在執行spark-submit
的過程中做了grep
,我得到了像這樣的標志-cp
:
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp /usr/lib/spark/conf/:/usr/lib/spark/lib/spark-assembly-1.5.0-hadoop2.7.1.jar:/usr/lib/spark/lib/datanucleus-api-jdo-3.2.6.jar:/usr/lib/spark/lib/datanucleus-rdbms-3.2.9.jar:/usr/lib/spark/lib/datanucleus-core-3.2.10.jar:/etc/hadoop/conf/:/etc/hadoop/conf/:/usr/lib/hadoop/lib/native/:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/*:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/*
有什么辦法可以解決這個問題嗎?
謝謝。
正如您所發現的,Dataproc在調用Spark時會在類路徑中包含Hadoop依賴項。 這主要是為了使用Hadoop輸入格式,文件系統等非常簡單。 缺點是你最終會得到Hadoop的番石榴版本,即11.02(見HADOOP-10101 )。
如何解決這個問題取決於您的構建系統。 如果使用Maven,可以使用maven-shade插件在新的包名下重新定位您的番石榴版本。 在GCS Hadoop Connector的包裝中可以看到這方面的一個例子,但它的關鍵是你的pom.xml構建部分中的以下插件聲明:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>your.repackaged.deps.com.google.common</shadedPattern>
</relocation>
</relocations>
</execution>
</execution>
</plugin>
類似的重定位可以使用sbt的sbt-assembly插件,ant的jarjar,以及jar的jarjar或shadow。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.