Cassandra - com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时

Cassandra - com.datastax.driver.core.exceptions.DriverException: Timeout while trying to acquire available connection

我在 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(); }

提前致谢

阿尔托伯

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

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

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

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