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