You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cassandra日志出现IllegalArgumentException警告:初始容量非法-231741684

Cassandra 2.2.10集群中"Illegal initial capacity"警告分析及解决办法

警告含义

这个警告是DataStax MCAC监控代理在上报集群指标时触发的异常:

  • 代理调用Cassandra的getApproximateKeyCount方法读取SSTable元数据时,反序列化过程中尝试以负数(-231741684)作为HashMap的初始容量,违反Java HashMap的初始化规则,抛出IllegalArgumentException。
  • 根源大概率是某份SSTable的元数据损坏,或是MCAC代理与Cassandra 2.2.10版本不兼容,导致元数据解析失败。
  • 目前集群未受影响是因为这只是监控指标上报的错误,不影响Cassandra核心读写逻辑。

触发异常的完整堆栈信息:

WARN  [insights-3-1] 2024-04-01 09:01:44,672 UnixSocketClient.java:645 - Error reporting: java.lang.IllegalArgumentException: Illegal initial capacity: -231741684
    at java.util.HashMap.<init>(HashMap.java:450) ~[na:1.8.0_402]
    at java.util.HashMap.<init>(HashMap.java:469) ~[na:1.8.0_402]
    at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:111) ~[apache-cassandra-2.2.10.jar:2.2.10]
    at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:94) ~[apache-cassandra-2.2.10.jar:2.2.10]
    at org.apache.cassandra.io.sstable.metadata.MetadataSerializer.deserialize(MetadataSerializer.java:102) ~[apache-cassandra-2.2.10.jar:2.2.10]
    at org.apache.cassandra.io.sstable.format.SSTableReader.getApproximateKeyCount(SSTableReader.java:254) ~[apache-cassandra-2.2.10.jar:2.2.10]
    at org.apache.cassandra.metrics.ColumnFamilyMetrics$9.getValue(ColumnFamilyMetrics.java:293) ~[apache-cassandra-2.2.10.jar:2.2.10]
    at org.apache.cassandra.metrics.ColumnFamilyMetrics$9.getValue(ColumnFamilyMetrics.java:287) ~[apache-cassandra-2.2.10.jar:2.2.10]
    at com.datastax.mcac.UnixSocketClient.writeMetric(UnixSocketClient.java:654) [datastax-mcac-agent.jar:na]
    at com.datastax.mcac.UnixSocketClient.access$700(UnixSocketClient.java:67) [datastax-mcac-agent.jar:na]
    at com.datastax.mcac.UnixSocketClient$2.lambda$onGaugeAdded$0(UnixSocketClient.java:521) ~[datastax-mcac-agent.jar:na]
    at com.datastax.mcac.UnixSocketClient.writeGroup(UnixSocketClient.java:634) [datastax-mcac-agent.jar:na]
    at com.datastax.mcac.UnixSocketClient.lambda$restartMetricReporting$1(UnixSocketClient.java:613) [datastax-mcac-agent.jar:na]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_402]
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:126) ~[netty-all-4.0.44.Final.jar:4.0.44.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399) ~[netty-all-4.0.44.Final.jar:4.0.44.Final]
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:307) ~[netty-all-4.0.44.Final.jar:4.0.44.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131) ~[netty-all-4.0.44.Final.jar:4.0.44.Final]
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) ~[netty-all-4.0.44.Final.jar:4.0.44.Final]
    at java.lang.Thread.run(Thread.java:750) ~[na:1.8.0_402]

缓解措施

1. 定位损坏的SSTable

  • 执行nodetool tablestats查看各表的SSTable状态,重点关注异常表的Approximate keys字段是否异常
  • 用sstableutil工具扫描节点上的SSTable,找出可能损坏的文件:
    sstableutil --verify <keyspace>.<table>
    

2. 修复或清理损坏的SSTable

  • 对损坏的SSTable执行sstableverify进行修复:
    sstableverify <path-to-sstable>
    
  • 若修复失败,可删除该SSTable文件,然后执行nodetool repair <keyspace>.<table>从其他节点同步数据

3. 调整MCAC代理配置

  • 确认MCAC代理版本与Cassandra 2.2.10兼容,若版本不匹配,升级到对应兼容版本
  • 临时禁用MCAC的键计数指标上报,修改MCAC配置文件(如mcac.yaml),关闭相关指标收集模块,避免日志刷屏

4. 长期解决方案:升级Cassandra

Cassandra 2.2.10已停止官方支持,存在大量已知bug和安全漏洞。建议升级到稳定的长期支持版本(如3.11.x系列),从根源上解决元数据解析等旧版本问题。

内容的提问来源于stack exchange,提问作者Pooja Nair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:17:06