Spark应用程序上的NoSuchMethodError

时间:2014-11-20 14:10:44

标签: java apache-spark rdd

我在Spark cluster上运行了一个应用程序,但它给了我error这样的代码:

     14/11/20 21:59:08 WARN TaskSetManager: Lost task 11.0 in stage 0.0 (TID 64, spark1): java.lang.NoSuchMethodError: com.google.common.io.ByteStreams.limit(Ljava/io/InputStream;J)Ljava/io/InputStream;        org.apache.spark.util.collection.ExternalAppendOnlyMap$DiskMapIterator.nextBatchStream(ExternalAppendOnlyMap.scala:456)        
     org.apache.spark.util.collection.ExternalAppendOnlyMap$DiskMapIterator.<init>  (ExternalAppendOnlyMap.scala:428)        org.apache.spark.util.collection.ExternalAppendOnlyMap.spill(ExternalAppendOnlyMap.scala:235)        org.apache.spark.util.collection.ExternalAppendOnlyMap.insertAll(ExternalAppendOnlyMap.scala:150)
    org.apache.spark.Aggregator.combineValuesByKey(Aggregator.scala:58)
    org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:48)        
    org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:92)
    org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:262)
    org.apache.spark.rdd.RDD.iterator(RDD.scala:229)
    org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
    org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:262)
    org.apache.spark.rdd.RDD.iterator(RDD.scala:229)
    org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
    org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:262)
    org.apache.spark.rdd.RDD.iterator(RDD.scala:229)
    org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:62)
    org.apache.spark.scheduler.Task.run(Task.scala:54)
    org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:177)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     java.lang.Thread.run(Thread.java:745)

有人能告诉我如何修复它吗?

2 个答案:

答案 0 :(得分:3)

不兼容的Google Guava库版本位于其运行时类路径之前。我建议澄清这种情况的类型并解决它:

案例1:项目依赖性中的问题

当您使用maven时,maven dependency:tree可以告诉您库中的所有依赖项。如果您看到多个Google Guava版本,请通过向库依赖项添加<exclusion>标记来修复此问题,该依赖项取决于不兼容的Guava版本。

案例2:运行时环境中的问题

如果您的依赖项是正确的,则问题出在您的运行时环境的CLASSPATH中,其中不兼容的Google Guava库版本位于所需版本之前。虽然我没有尝试过这个,但我看到spark有实验spark.files.userClassPathFirst配置(链接如下)。这可能会解决您的问题。 https://spark.apache.org/docs/1.1.0/configuration.html

答案 1 :(得分:0)

这里的问题是火花使用旧的番石榴版本 - 14.0.1。看起来你们中的一些依赖项带来了更新版本的番石榴。只需强制在你的构建工具中使用14.0.1,一切都应该没问题