无法连接到Cassandra: java.lang.NoSuchMethodError: com.google.common.util.concurrent.Futures.withFallback

4

我正在尝试使用Java(Hadoop2)连接到Cassandra,但出现以下错误:

Connecting to IP Address 127.0.0.1:9042...
16/04/12 10:35:13 INFO core.NettyUtil: Found Netty's native epoll     transport in the classpath, using it
Exception in thread "main" 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:177)
    at com.datastax.driver.core.Connection$Factory.open(Connection.java:731)
    at com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:251)
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:199)
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:77)
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1414)
    at com.datastax.driver.core.Cluster.getMetadata(Cluster.java:393)
    at cassandra.CassandraConnector.connect(CassandraConnector.java:42)
    at cassandra.Main.main(Main.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

请查看cassandra环境细节: - 已连接到位于127.0.0.1:9042的Test Cluster。 - [cqlsh 5.0.1 | Cassandra 2.2.5 | CQL spec 3.3.1 | Native protocol v4]
我正在使用以下Jars: - cassandra-driver-core-3.0.0.jar - guava-19.0.jar - netty-all-4.1.0.CR7.jar 我尝试过其他Jars(guava >=16.01,netty-all-4.0...,cassandra-driver-core-2.2.0),但总是会抛出类似的错误。
请参见下面用于建立连接的代码片段:
public void connect(final String node, final int port)

     {

        this.cluster =  Cluster.builder().addContactPoint(node).withPort(port)
            .build();

       final Metadata metadata = cluster.getMetadata();
       ProtocolVersion myCurrentVersion = cluster.getConfiguration()
            .getProtocolOptions()
            .getProtocolVersion();
       System.out.println(myCurrentVersion);

       out.printf("Connected to cluster: %s\n",  metadata.getClusterName());

       for (final Host host : metadata.getAllHosts())

          {

            out.printf("Datacenter: %s; Host: %s; Rack: %s\n",

            host.getDatacenter(), host.getAddress(), host.getRack());

          }

         session = cluster.connect();

     }

  public static void main(String[] args) {
        // TODO Auto-generated method stub

          final CassandraConnector client = new CassandraConnector();

          final String ipAddress = args.length > 0 ? args[0] : "127.0.0.1";

          final int port = args.length > 1 ? Integer.parseInt(args[1]) : 9042;

          out.println("Connecting to IP Address " + ipAddress + ":" + port + "...");

          client.connect(ipAddress, port);

          client.close();

    }

我认为这可能是由于某个版本冲突,但无法找到正确的版本。 已经检查了一些类似的帖子并尝试了解决方案(使用不同的jar包),但无法解决问题。 非常感谢任何帮助。


请问您能否提供更多信息,例如Hadoop版本、Cassandra版本、您正在使用哪个构建工具(例如Maven),您是否正在构建一个fat jar并且是否在使用YARN? - Abhinandan Satpute
Guava 14.0 引入了 Futures.withFallback。你的 Hadoop 作业必须使用旧版本。 - adutra
1个回答

1

是的,你说得对。这个问题是由于版本冲突引起的。 我建议您使用guava Jar并删除其他不必要的Jars。 同时,请查看this answer,它可能会对您有所帮助。


Hadoop版本:Hadoop 2.5.0-cdh5.3.8,Cassandra版本:[cqlsh 5.0.1 | Cassandra 2.2.5 | CQL规范3.3.1 | Native协议v4]。我的集群有8个节点。我只在其中一个节点上安装了Cassandra(独立),它没有配置。实际上,我不确定是否需要在集群中配置Cassandra,以便可以使用“hadoop jar jarname classname”执行Java jar文件。 - B K
我创建了一个JAR文件,提供了所有引用库中的JAR文件,然后我创建了该JAR并将其导出到我的特定节点。当我使用命令“java -jar jarname”执行时,它现在可以工作。但是当我尝试使用“hadoop jar jarname classname”执行时,它会抛出异常。 - B K
你已经移除了不必要的JAR包吗? - Abhinandan Satpute
cassandra-driver-core-3.0.0.jar、guava-19.0.jar和netty-all-4.1.0.CR7.jar似乎是必要的jar包,它们可以作为独立连接。但当我在Hadoop上执行时出现了问题。 - B K
这只是意味着Hadoop无法解析所需的依赖项。你能否给我完整的运行命令? - Abhinandan Satpute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接