27

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

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

我的问题是,这个限制是多少?我可以修改它吗?我怎么知道一个批次可以放置多少个元素?当我的批次“满”时?

4

3 回答 3

33

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

有一个

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

您可以选择cassandra.yaml增加它,但一定要进行测试以确保您真正帮助而不是损害您的吞吐量。

于 2016-01-10T04:04:15.793 回答
5

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

错误 19:54:13 [matches] 的批次大小为 103.072KiB,超过 53.072KiB 的指定阈值 50.000KiB。(见 batch_size_fail_threshold_in_kb)

于 2017-01-18T19:55:34.977 回答
4

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

使用 CHUNKSIZE = 1 从“mybackup”复制 mytable;

操作要慢得多,但至少现在可以工作

于 2016-10-26T08:53:36.847 回答