我有一个Cassandra的单节点实例。我一直在使用Java中的datastax驱动程序使用批处理语句向其中插入大量数据。
在插入过程中的某个点之后,我会看到一个NoHost可用异常,但是我仍然可以通过cql连接到节点并执行语句。Cassandra 日志警告我,批处理太大,当我将大小降低到建议的水平时,我仍然收到相同的错误,并且 Cassandra 日志文件中似乎没有其他错误。
以前有人遇到过这个错误吗,我觉得卡桑德拉有什么东西。我失踪了。
我遇到了与您遇到的问题非常相似的问题,并在这里解决了它:Cassandra集群的插入性能和插入稳定性都很差。
最根本的解决方案是,您只是在重载节点,而且批插入的速度有争议地不比异步插入快。当然,您应该使用一些技术来限制异步插入。此外,确保您的网络能够支持您的插入。我连接到了一个低功率的交换机,当我改变了连接服务器的路线(距离我只有几个房间)时,大约一半的问题消失了。
如果没有帮助,您应该使用多个节点,具体取决于您的插入率。
Cassandra中的batch关键字对于批量装载大量数据并不是一个性能优化。
批处理用于将原子操作组合在一起(如果一个写入失败,它们都会失败),您希望一起发生的操作。批处理保证,如果批处理的单个部分成功,则整个批处理都成功。
分批使用可能不会让你的大量摄入运行得更快
Cassandra使用一种称为批处理日志的机制来确保批处理的原子性。通过指定未记录的批处理,您关闭了此功能,因此批处理不再是原子的,可能会因部分完成而失败。当然,记录批处理并确保它们的原子性会有性能损失,使用未记录的批处理会消除这种损失。
在某些情况下,您可能希望使用未记录日志的批处理来确保属于同一个分区的请求(插入)被一起发送。如果您一起批处理操作,并且它们需要在不同的分区/节点中执行,那么您实际上是在为您的协调者创造更多的工作。参见Ryan博客中的具体例子:
阅读这篇文章