大批量插入期间的 Cassandra DataStax Driver NoHostAvailableException

Cassandra DataStax Driver NoHostAvailableException during large batch insert

我有一个 Cassandra 的单节点实例。我一直在使用Java中的datastax驱动程序使用批处理语句向其中插入大量数据。

在插入期间的某个时间点后,我看到了 NoHostAvailableException,但是我仍然可以通过 cql 连接到节点并执行语句。 Cassandra 日志警告我批次太大,当我将大小降低到建议的级别时,我仍然遇到相同的错误,并且 Cassandra 日志文件中似乎没有其他错误。

以前有没有人遇到过这个错误,我觉得 cassandra.yaml 中有一些东西是我遗漏的。

我遇到的问题与您遇到的问题非常相似,并在此处解决:

最根本的解决方案是您只是使节点过载,而且有争议的是,批量插入并不比异步插入快。当然,您应该使用一些技术来限制您的异步插入。另外,请确保您的网络可以支持您的插入。我连接到一个低功率交换机,当我将路由更改为连接我的服务器(离我有几个房间)时,大约一半的问题都消失了。

如果没有帮助,您应该使用多个节点,具体取决于您的插入率。

Cassandra 中的 batch 关键字不是性能优化,用于将大量数据批处理在一起以进行批量加载。

批处理用于将原子操作(如果一次写入失败,则全部失败)、您希望一起发生的操作组合在一起。批处理保证如果您的批处理中的一个部分成功,则整个批处理都成功。

使用批处理可能不会使您的大量摄取 运行 更快

Cassandra 使用一种称为批处理日志记录的机制来确保批处理的原子性。通过指定未记录的批处理,您将关闭此功能,因此该批处理不再是原子的,并且可能会因部分完成而失败。自然地,记录您的批次并确保它们的原子性会导致性能损失,使用未记录的批次将消除这种损失。

在某些情况下,您可能希望使用未记录的批处理来确保属于同一分区的请求(插入)一起发送。如果您一起批处理操作并且它们需要在不同的分区/节点中执行,那么您实际上是在为您的协调器创建更多的工作。在 Ryan 的博客中查看具体示例:

Read this post