我有一个Cassandra的单个节点实例。我一直在使用批处理语句使用Java中的datastax驱动程序将大量数据插入其中。
在插入过程中的某个点之后,我遇到了NoHostAvailableException,但是我仍然可以通过cql和execute语句连接到节点。 Cassandra日志警告我,批量太大,当我将大小降低到建议的水平时,我仍然得到相同的错误,并且Cassandra日志文件中似乎没有其他错误。
之前有没有人遇到过这个错误,我觉得cassandra.yaml中有一些我不知道的东西。
答案 0 :(得分:7)
我遇到的问题非常类似,并在此处解决:Cassandra cluster with bad insert performance and insert stability。
最底层的解决方案是,您只是在重载节点,而且批量插入有争议,并不比异步插入快。当然,您应该使用某种技术限制异步插入。此外,请确保您的网络可以支持您的插入。我连接到一个低功率的开关,当我改变路线时,我连接了我的服务器(这是我的几个房间),大约一半的问题都消失了。
如果没有帮助,您应该使用多个节点,具体取决于您的插入速率。
答案 1 :(得分:2)
Cassandra中的batch关键字不是针对批量加载批量处理大量数据的性能优化。
批处理用于将原子操作组合在一起(如果一次写入失败,它们都会失败),您希望一起发生的操作。批次保证如果批次的单个部分成功,则整个批次成功。
使用批次可能不会使您的质量摄取更快
Cassandra使用称为批量日志记录的机制来确保批处理的原子性。通过指定未记录的批处理,您将关闭此功能,因此批处理不再是原子的,可能会因部分完成而失败。自然地,记录批次并确保其原子性会有性能损失,使用未记录的批次将消除此惩罚。
在某些情况下,您可能希望使用未记录的批次来确保属于同一分区的请求(插入)一起发送。如果将操作一起批处理并且需要在不同的分区/节点中执行,则实质上是为协调器创建了更多工作。请参阅Ryan博客中的具体示例: