我有一个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
以增加它,但请务必进行测试以确保您确实在帮助而不损害您的吞吐量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句