【问题标题】:DataStax Cassandra java driver crashes with NoHostAvailableException after a few hundred insertsDataStax Cassandra java 驱动程序在数百次插入后因 NoHostAvailableException 而崩溃
【发布时间】:2014-09-28 12:55:06
【问题描述】:

我想编写一个将 5 个字符串(与文件资产相关)写入 Cassandra 的应用程序。我的代码基于 DataStax 文档中的教程。对于几百次插入,它可以工作大约 30 秒,但会因错误而崩溃:

原因:com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所有主机都失败(未尝试主机) 在 com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:65) 在 com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:256) 在 com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly (DefaultResultSetFuture.java:172) 在 com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52) ... 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:744) 原因:com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所有主机都失败(未尝试主机) 在 com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:103) 在 com.datastax.driver.core.SessionManager.execute(SessionManager.java:368) 在 com.datastax.driver.core.SessionManager.executeQuery(SessionManager.java:404) 在 com.datastax.driver.core.SessionManager.executeAsync(SessionManager.java:85) ... 8 更多

该过程仍在运行,我可以重新运行单元测试并得到相同的结果:几百次插入,然后出现此错误。服务器没有显示任何痛苦或错误的迹象。

我正在使用驱动程序:

    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>2.0.3</version>
    </dependency>

这是我的客户端代码:

private static final String BOUND_STATEMENT = "INSERT INTO myschema.files(file_name, md5, last_modified, size, hash_date) "
        + "VALUES (?, ?, ?, ?, ?);";
@Override
public void persist(FileEntry entry) {
    Session session = cluster.connect();
    //prepare statement, if it doesn't exist.
    if (persistPs == null) {
        persistPs = session.prepare(BOUND_STATEMENT);
    }
    BoundStatement boundStatement = new BoundStatement(persistPs);
    session.execute(boundStatement.bind(entry.getFileName(), entry.getMd5(), entry.getLastModified(),
            entry.getSize(), entry.getHashDate()));
    session.close();
    System.out.print(".");
}

我在我的本地主机上运行 Cassandra 2.0.9(带有固态驱动器和最近的 macbook 的 OSX)。

关于如何使它不崩溃的任何线索?如果这只是 DataStax 驱动程序的问题,我很乐意使用任何其他驱动程序。

我没有产生太严重的负载,服务器进程也没有抛出任何异常或提示可能出现的问题。我听说过其他组织在 Cassandra 上取得了成功,所以我认为这与我的客户端代码有关。

谢谢!

【问题讨论】:

  • 您是否检查过 Cassandra 服务器进程是否正在运行?
  • 感谢您回复 Raedwald。它正在运行。我更新了问题以更清楚地表明服务器没有问题的迹象。它似乎是我的客户端代码。
  • 当时您服务器上的system.log 是否记录了错误?
  • 另外,您无需一直打开和关闭会话。尝试重写您的 persist 方法以接受 session 作为参数。然后在 main 的开头调用一次 connect 并在结尾处关闭。
  • 史蒂夫我在这里遇到了类似的问题。将驱动程序从 2.0.3 更新到 2.0.4 但同样的问题。我有一个 5 个节点的 dev-cluster,当我让集群闲置一段时间(没有 rw op)时,我无法再连接了。重新启动应用程序(不接触任何节点)后,事情又开始工作了。看着 getErrors() 它说从五个节点中的每个节点读取超时。我对 2.0.8 中修复的 2.0.7 中的类似问题有疑问——我虽然可以修复,但你在 2.0.9 中有问题——如果我们找不到解决方案,我会在 datastax java 驱动程序 jira 中打开一个问题排队。

标签: java cassandra


【解决方案1】:

BryceAtNetwork23 是正确的。通过我将会话对象从一个调用传递到另一个调用,这个问题得到了“解决”。

public final void persist(final FileEntry entry, final Session session) {
    prepareInsertStatement(session);
    final BoundStatement boundStatement = new BoundStatement(persistPs);
    //bind values from our bean to our insert query
    session.execute(boundStatement.bind(entry.getFileName(), entry.getMd5(), entry.getLastModified(),
            entry.getSize(), entry.getHashDate()));
}

private final synchronized void prepareInsertStatement(final Session session) {
    // prepare statement, if it doesn't exist.
    if (persistPs == null) {
        persistPs = session.prepare(BOUND_STATEMENT);
    }
}

我不知道这是否是 Cassandra 引擎或 DataStax 驱动程序的可扩展性问题,但通常情况下,我必须比一天更努力地工作才能让平台屈服。无论如何,我对他们的文档感到沮丧。我从来没有遇到过让平台运行而不会崩溃的麻烦。他们的示例在插入 1000 次后使单个节点崩溃。如果我们正在评估 Cassandra,我们很可能想要插入超过 1000 行。

也就是说,一旦我将会话从一个调用传递到另一个调用,代码就会运行得非常快并且执行得很好。我有一些矛盾心理,但很高兴一切终于奏效了。谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2018-01-18
    • 2014-09-09
    • 2019-04-18
    • 2019-02-25
    • 2016-09-06
    • 2018-02-15
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多