大批量插入期间的Cassandra DataStax驱动程序NoHostAvailableException

时间:2015-03-16 12:03:50

标签: java cassandra datastax-java-driver

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

在插入过程中的某个点之后,我遇到了NoHostAvailableException,但是我仍然可以通过cql和execute语句连接到节点。 Cassandra日志警告我,批量太大,当我将大小降低到建议的水平时,我仍然得到相同的错误,并且Cassandra日志文件中似乎没有其他错误。

之前有没有人遇到过这个错误,我觉得cassandra.yaml中有一些我不知道的东西。

2 个答案:

答案 0 :(得分:7)

我遇到的问题非常类似,并在此处解决:Cassandra cluster with bad insert performance and insert stability

最底层的解决方案是,您只是在重载节点,而且批量插入有争议,并不比异步插入快。当然,您应该使用某种技术限制异步插入。此外,请确保您的网络可以支持您的插入。我连接到一个低功率的开关,当我改变路线时,我连接了我的服务器(这是我的几个房间),大约一半的问题都消失了。

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

答案 1 :(得分:2)

Cassandra中的batch关键字是针对批量加载批量处理大量数据的性能优化。

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

使用批次可能不会使您的质量摄取更快

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

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

Read this post