我有一个Java客户端,批量推送(INSERT)记录到Cassandra集群.批处理中的元素都具有相同的行键,因此它们都将放在同一节点中.此外,我不需要事务是原子的,所以我一直在使用未记录的批处理.
每个批处理中INSERT命令的数量取决于不同的因素,但可以是5到50000之间的任何值.首先,我只需要在一个批处理中输入尽可能多的命令并提交它.这扔了com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large
.然后我每批使用1000 INSERT的上限,然后下降到300.我注意到我只是随机猜测而不知道这个限制的确切位置,这可能会导致麻烦.
我的问题是,这个限制是什么?我可以修改吗?我怎么知道批量中可以放置多少个元素?当我的批次"满员"时?
我建议不要增加上限,只是分成多个请求.将所有内容放在一个巨大的单一请求中将显着地对协调器产生负面影响.将所有内容放在一个分区中可以通过减少一些延迟来提高某些批量批处理的吞吐量,但批量从不打算用于提高性能.因此,尝试通过使用不同的批量大小来优化以获得最大吞吐量将在很大程度上取决于用例/模式/节点,并且将需要特定的测试,因为在它开始降级的大小上通常存在悬崖.
有一个
# Fail any batch exceeding this value. 50kb (10x warn threshold) by default. batch_size_fail_threshold_in_kb: 50
你cassandra.yaml
可以选择增加它,但一定要进行测试以确保你真正的帮助而不是损害你的吞吐量.
查看Cassandra日志,您将能够发现以下内容:
错误19:54:13 [matches]的批次大小为103.072KiB,超出了指定阈值50.000KiB 53.072KiB。(请参见batch_size_fail_threshold_in_kb)