我在Cassandra中遇到以下持久性错误:
Cassandra-所有主机尝试查询失败(尝试:xxxxxx(com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时)(您可能希望增加驱动程序数量)主机连接))))
当我尝试将大型数据库加载到单个群集时,会出现问题。到目前为止,我已经尝试了有关此问题的所有建议:
我在这里粘贴我正在使用的功能,按照此blog post中的建议加载,也许有人可以发现某些内容。更改BATCH_SIZE是唯一能够以某种方式改善情况的因素。如果我在1_000_000中设置它几乎立即失败,如果我将其设置为100_000它运行了相当长的一段时间。在下面的代码中,pstatement是PreparedStatement,而future是a 列表< ResultSetFuture>
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(); }
提前致谢
Altober
答案 0 :(得分:2)
驱动程序不会同时处理超过给定主机的最大请求数。此数字取决于您的池配置,请参阅详细信息here(使用左上角的组合以匹配您的驱动程序版本)。
如果您尝试发送更多请求,他们将排队等候。消息Timeout while trying to acquire available connection
表示排队请求超时,换句话说,您发送的内容超出了驱动程序可以处理的范围。
使用驱动程序默认值时,最大值应为1024.这是非常保守的,考虑到您描述的设置,我认为您可以更高。尝试添加更多连接和/或增加每个连接的请求数,相应地调整BATCH_SIZE
。
答案 1 :(得分:-3)
批次是一次更新/插入多个表格的最佳方式。批量应该很小,低于5 kb的数据。批量用于原子性,而不是性能优化。请参考https://media.com/@foundev/cassandra-batch-loading-without-the-batch-keyword-40f00e35e23e以获得更快的数据插入,并且不使用批处理语句