Cassandra:批量写入优化

时间:2016-08-13 10:49:11

标签: cassandra datastax datastax-java-driver cassandra-3.0

我从客户端获得了大约20个密钥的批量写入请求。 我可以在一个批处理中将它们写入C *,也可以以异步方式单独写入它们并等待将来完成它们。

批量写入似乎不是一个goo选项,因为我的插入率很高,如果键属于不同的分区,协调员将不得不做额外的工作。

  

在datastax java驱动程序中是否有一种方法可以将密钥组合在一起   它可能属于同一个分区,然后将它们分成小块   批处理,然后在异步中执行unidual unlogged batch write。在那里面   我可以在协调器的同时减少对服务器的rpc调用   必须在本地写。我将使用令牌感知策略。

1 个答案:

答案 0 :(得分:0)

记录批次应该在Cassandra中小心使用,因为它们会产生额外的开销。它还取决于分区键分配。如果批量写入针对单个分区,则使用未记录批处理会导致单个插入操作。

一般来说,以异步方式编写它们似乎是一个很好的方法,如下所示: https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-the-nuanced-edition-dd78d61e9885

您可以在上面的网站上找到如何处理多个异步写入的示例代码: https://gist.github.com/rssvihla/26271f351bdd679553d55368171407be#file-bulkloader-java https://gist.github.com/rssvihla/4b62b8e5625a805583c1ce39b1260ff4#file-bulkloader-java

修改
请阅读此内容: https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/#14

  

单个分区批处理的成本是多少?

     

没有为单个分区批次编写批处理日志。该   协调员没有任何额外的工作(如多分区   写道)因为一切都进入了一个分区。单   优化分区批次:它们应用于单个批次   RowMutation [10]。

     

简而言之:单个分区批次不会增加太多负载   服务器比正常写入。


  

多分区批处理的成本是多少?

     

我想引用克里斯托弗·巴蒂,因为他总结了这一点   非常好的在他的帖子“Cassandra anti-pattern:Logged batch”[3]:

     

Cassandra [首先]将所有语句写入批处理日志。那   在协调器的情况下,批处理日志被复制到另外两个节点   失败。如果协调器失败,则批处理日志的另一个副本   将接管。 [..]协调员必须做更多的工作   集群中的任何其他节点。

     

再一次,在子弹中必须做些什么:

     
      
  1. 序列化批处理语句
  2.   
  3. 将序列化批次写入批日志系统表
  4.   
  5. 将此序列化批次复制到2个节点
  6.   
  7. 坐标写入保存不同分区的节点
  8.   
  9. 成功时从批处理日志中删除序列化批次(也在2个副本上)
  10.         

    请记住,自Cassandra 2.1.6

    以来,不推荐使用多个分区的未记录批次