【问题标题】:Mutation of 17076203 bytes is too large for the maxiumum size of 1677721617076203 字节的突变对于 16777216 的最大大小来说太大了
【发布时间】:2014-12-18 06:37:45
【问题描述】:

我在 cassandra 设置中有“commitlog_segment_size_in_mb: 32”,但下面的错误表明最大大小为 16777216,约为 16mb。我是否正在查看修复以下错误的正确设置?

我是根据http://mail-archives.apache.org/mod_mbox/cassandra-user/201406.mbox/%3C53A40144.2020808@gmail.com%3E提供的建议参考这个设置

我正在为 Cassandra 使用 2.1.0-2。

我使用的是 Kairosdb,写入缓冲区最大大小为 0.5Mb。

WARN  [SharedPool-Worker-1] 2014-10-22 17:31:03,163 AbstractTracingAwareExecutorService.java:167 - Uncaught exception on thread Thread[SharedPool-Worker-1,5,main]: {}
java.lang.IllegalArgumentException: Mutation of 17076203 bytes is too large for the maxiumum size of 16777216
        at org.apache.cassandra.db.commitlog.CommitLog.add(CommitLog.java:216) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.db.commitlog.CommitLog.add(CommitLog.java:203) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:371) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:351) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.db.Mutation.apply(Mutation.java:214) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.db.MutationVerbHandler.doVerb(MutationVerbHandler.java:54) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask.java:62) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_67]
        at org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:163) ~[apache-cassandra-2.1.0.jar:2.1.0]
        at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:103) [apache-cassandra-2.1.0.jar:2.1.0]
        at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]

【问题讨论】:

  • 如果您正在寻找超快延迟,您可能需要考虑将写入分成更小的块。

标签: cassandra datastax kairosdb


【解决方案1】:

您正在查看 .yaml 中的正确参数。 C* 允许的最大写入大小是 commit_log_segment_size_in_mb 的一半,默认为 32mb,因此默认最大大小为 16mb。

背景

commit_log_segment_size_in_mb 代表提交日志归档或时间点备份的块大小。仅当您在 commitlog_archiving.properties 文件中配置了 archive_command 或 restore_command 时,它们才处于活动状态。

【讨论】:

  • 我正在使用 kairosdb,它写入 cassandra。根据 kairosdb 属性,最大写入缓冲区大小为 0.5Mb。
  • 所以你是说你的写入实际上没有达到 16mb?
  • 我想是的。 commitlog_sync_period_in_ms 是 10s,那会不会是 batch size 超过了 16mb?
  • 请忽略我之前的评论。 commitlog_sync 是周期性的,不是批处理的。
  • 在 2.2.4 中,名称有点不同:“commitlog_segment_size_in_mb”。
【解决方案2】:

这是正确的设置。这意味着 Cassandra 将丢弃此写入,因为它超过了配置的提交日志段大小的 50%。 所以在集群中每个节点的 Cassandra.yaml 中设置参数 commitlog_segment_size_in_mb: 64 并重启每个节点使更改生效。

原因: 按照设计意图,允许的最大段大小是配置的 commit_log_segment_size_in_mb 的 50%。这是为了让 Cassandra 避免编写具有大量空白空间的段。

详细说明;最多两个 32MB 的段将适合 64MB,但是 40MB 仅在留下大量未使用空间时才适合。

来自 datastax 的参考链接:

https://support.datastax.com/hc/en-us/articles/207267063-Mutation-of-x-bytes-is-too-large-for-the-maxiumum-size-of-y-

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2016-09-10
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多