在Hadoop2.0.0-cdh4.3.1上运行程序时,MapReduce给出了以下错误:
java.lang.NoSuchMethodError:com.google.common.util.concurrent.Futures.withFallback
但是,当我通过执行JAR进行测试时:
java -cp myclass
它运行得完美无缺。我在这里不知道,就好像JAR中有所谓的Futures.withFallback一样,这就是为什么在本地执行它的原因。它使用番石榴连接Cassandra,完整的堆栈跟踪如下:
attempt_201507081740_21115_m_000050_0: [FATAL] Child - Error running child : 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;
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.Connection.initAsync(Connection.java:176)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.Connection$Factory.open(Connection.java:721)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:244)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:190)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:78)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1272)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.Cluster.init(Cluster.java:158)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.Cluster.connect(Cluster.java:248)
attempt_201507081740_21115_m_000050_0: at com.datastax.driver.core.Cluster.connect(Cluster.java:281)
attempt_201507081740_21115_m_000050_0: at com.cassandra.CassandraHandler.getConnection(CassandraHandler.java:40)
attempt_201507081740_21115_m_000050_0: at com.json.flatten.DynamicJsonFlattener.<init>(DynamicJsonFlattener.java:35)
attempt_201507081740_21115_m_000050_0: at com.mapreduce.Map.map(Map.java:18)
attempt_201507081740_21115_m_000050_0: at com.mapreduce.Map.map(Map.java:13)
attempt_201507081740_21115_m_000050_0: at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:140)
attempt_201507081740_21115_m_000050_0: at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672)
attempt_201507081740_21115_m_000050_0: at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)
attempt_201507081740_21115_m_000050_0: at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
attempt_201507081740_21115_m_000050_0: at java.security.AccessController.doPrivileged(Native Method)
attempt_201507081740_21115_m_000050_0: at javax.security.auth.Subject.doAs(Subject.java:396)
attempt_201507081740_21115_m_000050_0: at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
attempt_201507081740_21115_m_000050_0: at org.apache.hadoop.mapred.Child.main(Child.java:262)
Hadoop版本或任何其他版本冲突都有问题。请给我任何想法!
编辑:我已经证实,在番石榴v18 JAR中没有“v18”方法。现在我是无知的,请帮助我的任何想法!
发布于 2015-07-23 22:54:05
编辑:没有看到你的堆栈跟踪。您的堆栈跟踪显示有一个版本未匹配。您可以在该文档上找到合适的兼容版本。
确保所需的jar文件在类路径中可用。
当您使用-cp选项运行时,您的jvm在类路径变量中分隔的所有目录位置中搜索所需的jar文件。
确保您还在类路径中添加了;;,这将导致jvm加载/搜索当前工作目录中可用的类/jar文件。
发布于 2015-08-19 11:53:28
我相信我已经发现了这个问题(或者至少给我一个解决方案)。
如果您碰巧使用的是Google的google-api-client
库:
com.google.api-client » google-api-client
它依赖于guava-jdk5 13.0
。这个版本的Futures.withFallback
没有guava-jdk5
(它是在14.0
中引入的),很可能与您对番石榴的依赖相冲突。
如果这是您的情况,则解决方案是向com.google.guava:guava-jdk5:17.0
添加一个依赖项。它是JDK5
的guava
后端,但它确实可以解决这个问题。
谷歌为什么如此依赖于一个非常古老的番石榴版本(尽管如此,它还是一个后端版本),这是我无法理解的。
https://stackoverflow.com/questions/31603890
复制