【问题标题】:Cassandra - com.datastax.driver.core.exceptions.DriverException: Timeout while trying to acquire available connectionCassandra - com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时
【发布时间】:2015-11-04 08:49:13
【问题描述】:

我在 Cassandra 中遇到以下持续错误:

Cassandra- 尝试查询的所有主机都失败(尝试:xxxxxx(com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时)(您可能希望增加每主机连接))))

当我尝试将大型数据库加载到单个集群中时,会出现问题。到目前为止,我已经尝试了我发现的有关此问题的所有建议:

  • 我只有一个集群和一个会话
  • 我正在为插入使用准备好的语句
  • 我慷慨地增加了双方的超时时间

我正在这里粘贴我用来加载的函数,遵循blog post 中的建议,也许有人能发现一些东西。更改 BATCH_SIZE 是唯一能以某种方式改善这种情况的因素。如果我将它设置为 1_000_000 它几乎会立即失败,如果我将它设置为 100_000 它会运行很长一段时间。在下面的代码中,pstatement 是 PreparedStatement,futures 是 列表

.

public boolean addPair(byte[] key, byte[] value) throws IOException {
    if (futures.size() >= BATCH_SIZE) {
      flush();
    }
    BoundStatement boundStatementInsert = new BoundStatement(pstatement);
    futures
           .add(session.executeAsync(boundStatementInsert.bind(ByteBuffer.wrap(key), ByteBuffer.wrap(value)).setConsistencyLevel(ConsistencyLevel.ALL)));
    return true; }


private void flush() {
    for (ResultSetFuture rsf : futures) {
      rsf.getUninterruptibly();
    }
    futures.clear(); }

提前致谢

阿尔托伯

【问题讨论】:

    标签: java cassandra key-value-store


    【解决方案1】:

    驱动程序不会同时处理超过最大数量的给定主机的请求。此数字取决于您的池配置,请参阅详细信息here(使用左上角的组合来匹配您的驱动程序版本)。

    如果您尝试发送更多请求,它们将排队。消息Timeout while trying to acquire available connection 表示排队的请求正在超时,换句话说,您发送的请求超出了驱动程序的处理能力。

    使用驱动程序默认值,最大值应为 1024。这是非常保守的,鉴于您描述的设置,我认为您可以更高。尝试添加更多连接和/或提高每个连接的请求数,相应地调整 BATCH_SIZE

    【讨论】:

      【解决方案2】:

      批量是一次更新/插入多个表的最佳方式。批次应该很小,小于 5 kb 的数据。批处理是为了原子性,而不是性能优化。请参考 https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-keyword-40f00e35e23e 以获得更快的数据插入并且它不使用批处理语句

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        相关资源
        最近更新 更多