首页 文章

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

提问于
浏览
3

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

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

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

2 回答

  • 7

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

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

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

  • 2

    Cassandra中的batch关键字是 not ,用于为批量加载批量处理大量数据的性能优化 .

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

    Using batches will probably not make your mass ingestion run faster

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

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

    Read this post

相关问题