【问题标题】:What is the batch limit in Cassandra?Cassandra 的批量限制是多少?
【发布时间】:2016-04-14 11:33:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: cassandra cassandra-3.0 cassandra-2.2


    【解决方案1】:

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

    有一个

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

    cassandra.yaml 中的选项以增加它,但请务必进行测试以确保您真正帮助而不是损害您的吞吐量。

    【讨论】:

    • 这就是我想要的,谢谢。您知道在客户端监控批次大小的最佳方法是什么吗?
    • 取决于您使用的驱动程序,但在 java-driver 中,您可以在批处理中的每个单独语句上使用 getValues(),它会返回一个 ByteBuffers 数组,您可以使用剩余的( ) 方法来单独获取缓冲区的大小并将它们全部汇总,但总的来说我不建议这样做。你不应该创建超大批量,只要足够大,你可以感觉到你离这个限制还很远。
    • 这里有很多东西。 C* 提倡按列设计而不是按行设计,C* 说每个分区有 2B 列,但凭经验我们知道最佳位置是 100MB。所以即使有 100MB 的分区,如果一个批次的默认大小是 50KB,那就像 100MB/50KB=3125 请求检索一个 100MB 的分区,所以请求太多了。
    • 今天Batching还需要通过coordinator吗?为什么我们不能使用令牌感知策略并将单个分区的所有行(假设所有行的数据大小为 100MB)直接批处理到正确的节点?如果不是,在几个请求中检索 100MB 分区的最佳批量大小是多少?
    • @user1870400 如果要检索整个分区,则不需要使用批处理查询。只需将 1 个查询与分页一起使用。如果您正在编写分区,对我来说 3000 次请求 100MB 似乎没问题。
    【解决方案2】:

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

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

    【讨论】:

    • @user1870400,我正在使用这个配置 ..cassandra.concurrent.writes=1500 cassandra.output.batch.size.bytes=2056 cassandra.output.batch.grouping.key=partition cassandra.output .consistency.level=ANY cassandra.output.batch.grouping.buffer.size=3000 cassandra.output.throughput_mb_per_sec=25
    • @user1870400 我有 2 亿条记录 x 每条记录 100 字节......加载这些数据需要 2 小时......那么如何微调上述参数?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-25
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多