Cassandra 的批量限制是多少?

What is the batch limit in Cassandra?

我有一个 Java 客户端,可以批量推送 (INSERT) 记录到 Cassandra 集群。批次中的元素都具有相同的行键,因此它们都将被放置在同一个节点中。此外,我不需要事务是原子的,所以我一直在使用未记录的批处理。

每批中 INSERT 命令的数量取决于不同的因素,但可以是 5 到 50000 之间的任何值。首先,我只是在一批中放入尽可能多的命令并提交。这扔了com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large。然后我使用每批次 1000 个 INSERT 的上限,然后减少到 300 个。我注意到我只是随机猜测而不知道这个限制的确切来源,这可能会导致麻烦。

我的问题是,这个限制是多少?我可以修改吗?我怎么知道可以在一个批次中放置多少个元素?当我的批次是 "full"?

我建议不要增加上限,而是拆分成多个请求。将所有内容放在一个巨大的单个请求中会对协调器产生重大负面影响。将所有内容都放在一个分区中可以通过减少一些延迟来提高某些大小的批处理的吞吐量,但批处理绝不意味着用于提高性能。因此,尝试通过使用不同的批次大小来优化以获得最大吞吐量将在很大程度上取决于使用 case/schema/nodes 并且需要进行特定测试,因为通常在开始降级的大小上存在悬崖。

有一个

# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 50

在您的 cassandra.yaml 选项中增加它,但一定要进行测试以确保您确实有助于而不是损害您的吞吐量。

我通过将 CHUNKSIZE 更改为较低的值解决了这个问题(例如 1) https://docs.datastax.com/en/cql/3.1/cql/cql_reference/copy_r.html

使用 CHUNKSIZE = 1 从 'mybackup' 复制我的表;

操作速度慢了很多,但至少现在可以了

查看 Cassandra 日志,您将能够发现以下内容:

错误19:54:13 [匹配项] 的批处理大小为 103.072KiB,超过指定阈值 50.000KiB 53.072KiB。 (参见 batch_size_fail_threshold_in_kb)