Cassandra:批量写入优化

Pet*_*ter 11 cassandra datastax-java-driver datastax cassandra-3.0

我得到批量写入请求,让我们说来自客户端的20个密钥.我可以在一个批处理中将它们写入C*,也可以以异步方式单独写入它们并等待将来完成它们.

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

有没有一种方法可以在datastax java驱动程序中使用它来组合可能属于同一分区的键,然后将它们分成小批量,然后在异步中进行不定期的未记录批量写入.通过这种方式,我可以减少对服务器的rpc调用,同时协调器必须在本地写入.我将使用令牌感知策略.

fol*_*lex 9

你的想法是正确的,但没有内置的方式,你通常手动这样做.

这里的主要规则是使用TokenAwarePolicy,因此在驾驶员方面会发生一些协调.然后,您可以通过分区键的相等性对请求进行分组,这可能就足够了,具体取决于您的工作负载.

我所说的'按分区键相等分组'就是说你有一些看起来像的数据

MyData { partitioningKey, clusteringKey, otherValue, andAnotherOne }
Run Code Online (Sandbox Code Playgroud)

然后在插入几个这样的对象时,将它们分组MyData.partitioningKey.对于所有存在的paritioningKey值,您将所有对象都包含在内partitioningKey,然后将它们包装起来BatchStatement.现在你有几个BatchStatements,所以只需执行它们.

如果你想进一步模仿cassandra哈希,那么你应该通过类中的getMetadata方法查看集群元数据com.datastax.driver.core.Cluster,有方法getTokenRanges并将它们与Murmur3Partitioner.getToken你配置的结果或任何其他分区器进行比较cassandra.yaml.我自己从未尝试过.

所以,我建议实施第一种方法,然后对您的应用程序进行基准测试.我自己正在使用这种方法,而且在我的工作量方面,它比没有批处理更好,更不用说没有分组的批处理了.