首页 文章

Cassandra的批量限制是多少?

提问于
浏览
21

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

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

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

3 回答

  • 26

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

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

  • 2

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

    COPY mytable FROM'mybackup'WITH CHUNKSIZE = 1;

    操作速度要慢得多,但现在至少可以正常工作

  • 4

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

    有一个

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

    你的 cassandra.yaml 中的选项可以增加它,但一定要测试以确保你的实际帮助而不是伤害你的吞吐量 .

相关问题