【问题标题】:Running spark job using Yarn giving error:com.google.common.util.concurrent.Futures.withFallback使用纱线运行火花作业给出错误:com.google.common.util.concurrent.Futures.withFallback
【发布时间】:2015-08-17 10:12:33
【问题描述】:

我正在尝试使用 yarn 运行 spark 作业,但出现以下错误

java.lang.NoSuchMethodError: com.google.common.util.concurrent.Futures.withFallback(Lcom/google/common/util/concurrent/ListenableFuture;Lcom/google/common/util/concurrent/FutureFallback;Ljava/util/concurrent/Executor;)Lcom/google/common/util/concurrent/ListenableFuture;
at com.datastax.driver.core.Connection.initAsync(Connection.java:176)
at com.datastax.driver.core.Connection$Factory.open(Connection.java:721)
at com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:248)
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:194)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:82)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1307)
at com.datastax.driver.core.Cluster.init(Cluster.java:159)
at com.datastax.driver.core.Cluster.connect(Cluster.java:249)
at com.figmd.processor.ProblemDataloader$ParseJson.call(ProblemDataloader.java:46)
at com.figmd.processor.ProblemDataloader$ParseJson.call(ProblemDataloader.java:34)
at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$4$1.apply(JavaRDDLike.scala:140)
at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$4$1.apply(JavaRDDLike.scala:140)
at org.apache.spark.rdd.RDD$$anonfun$14.apply(RDD.scala:618)
at org.apache.spark.rdd.RDD$$anonfun$14.apply(RDD.scala:618)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:280)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:247)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
at org.apache.spark.scheduler.Task.run(Task.scala:56)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:200)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

集群详情: 火花 1.2.1,Hadoop 2.7.1 我使用 spark.driver.extraClassPath 提供了类路径。 hadoop 用户也可以访问该类路径。但我认为 yarn 没有在该类路径上获取 JAR。 我无法找到它的根本原因。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 您是否正确检查了您的 YARN 集群,我猜它已经有一些版本的 Guava jar 并且在您的 fat jar 中您有最新版本,它被 YARN Cluster jar 覆盖。
  • 对不起,但我可以知道在哪里可以检查 YARN 集群 jar 吗?我认为 yar 没有得到“spark.driver.extraClassPath”和“spark. executor.extraClassPath"。你能帮我吗?

标签: hadoop apache-spark classpath hadoop-yarn


【解决方案1】:

添加到@Arjones 答案,如果您使用 gradle + GradleShadow,您可以将其添加到您的 build.gradle 以重新定位或重命名 Guava 类。

shadowJar {
    relocate 'com.google.common', 'com.example.com.google.common'
}

【讨论】:

  • 如果我真的需要番石榴来进行 url 解析或类似的东西怎么办?
【解决方案2】:

我遇到了同样的问题,解决方案是shade guava以避免classpath碰撞。

如果您使用 sbt assembly 构建您的 jar,您只需将其添加到您的 build.sbt

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("com.google.**" -> "shadeio.@1").inAll
)

我写了一篇博文,描述了我实现此解决方案的过程:Making Hadoop 2.6 + Spark-Cassandra Driver Play Nice Together

希望对你有帮助!

【讨论】:

    【解决方案3】:

    问题与番石榴版本不匹配有关。

    withFallback 已添加到 Guava 版本 14。看起来你的类路径中有 Guava

    【讨论】:

    • 不,我使用的是 16.0.1 版本的 Guava。
    • 你在用胖罐子吗??
    • 是的。我在类路径上有所有必需的依赖项 JAR。
    • 检查 maven 依赖树以获取旧版本的 guava (mvn dependency:tree -Doutput=/path/to/file) 或分解 jar 并反编译 com.google.common.util.concurrent.Futures跨度>
    • 我的问题是一样的,一些 Hadoop 组件正在使用 guava 11。一旦更改了 pom.xml 以抑制 guava 11,它就可以工作了。谢谢。
    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2017-05-17
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多