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
相关产品推荐
相关产品推荐

