【发布时间】:2016-06-24 00:34:14
【问题描述】:
我正在使用 cassandra 2.0.9,在其中我遇到了一些意外关闭,提示 OutOfMemoryError,在运行后台运行小压缩时出现此错误。在此之前,我对墓碑有一些警告。但我已将 gc_grace 设置为仅一天。
WARN [ReadStage:95] 2016-03-09 06:10:31,548 SliceQueryFilter.java (line 225) Read 1 live and 21072 tombstoned cells in mykeyspace.user_metrics_overview (see tombstone_warn_threshold). 1 columns was requested, slices=[-], delInfo={deletedAt=-9223372036854775808, localDeletion=2147483647}
ERROR [CompactionExecutor:68695] 2016-03-09 06:10:31,550 CassandraDaemon.java (line 199) Exception in thread Thread[CompactionExecutor:68695,1,main]
java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:658)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)
at sun.nio.ch.Util.getTemporaryDirectBuffer(Util.java:174)
at sun.nio.ch.IOUtil.read(IOUtil.java:195)
at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:149)
at org.apache.cassandra.io.compress.CompressedRandomAccessReader.decompressChunk(CompressedRandomAccessReader.java:110)
at org.apache.cassandra.io.compress.CompressedRandomAccessReader.reBuffer(CompressedRandomAccessReader.java:87)
at org.apache.cassandra.io.compress.CompressedThrottledReader.reBuffer(CompressedThrottledReader.java:41)
at org.apache.cassandra.io.util.RandomAccessReader.seek(RandomAccessReader.java:280)
at org.apache.cassandra.io.sstable.SSTableScanner$KeyScanningIterator.computeNext(SSTableScanner.java:262)
at org.apache.cassandra.io.sstable.SSTableScanner$KeyScanningIterator.computeNext(SSTableScanner.java:203)
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
at org.apache.cassandra.io.sstable.SSTableScanner.hasNext(SSTableScanner.java:183)
at org.apache.cassandra.utils.MergeIterator$Candidate.advance(MergeIterator.java:144)
at org.apache.cassandra.utils.MergeIterator$ManyToOne.<init>(MergeIterator.java:87)
at org.apache.cassandra.utils.MergeIterator.get(MergeIterator.java:46)
at org.apache.cassandra.db.compaction.CompactionIterable.iterator(CompactionIterable.java:47)
at org.apache.cassandra.db.compaction.CompactionTask.runWith(CompactionTask.java:129)
at org.apache.cassandra.io.util.DiskAwareRunnable.runMayThrow(DiskAwareRunnable.java:48)
at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
at org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:60)
at org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:59)
at org.apache.cassandra.db.compaction.CompactionManager$BackgroundCompactionTask.run(CompactionManager.java:198)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
INFO [StorageServiceShutdownHook] 2016-03-09 06:10:31,551 ThriftServer.java (line 141) Stop listening to thrift clients
ERROR [CompactionExecutor:68695] 2016-03-09 06:10:31,551 CassandraDaemon.java (line 199) Exception in thread Thread[CompactionExecutor:68695,1,main]
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:705)
at org.apache.cassandra.service.CassandraDaemon$2.uncaughtException(CassandraDaemon.java:205)
at org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor.handleOrLog(DebuggableThreadPoolExecutor.java:220)
at org.apache.cassandra.db.compaction.CompactionManager$CompactionExecutor.afterExecute(CompactionManager.java:973)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
INFO [StorageServiceShutdownHook] 2016-03-09 06:10:31,590 Server.java (line 182) Stop listening for CQL clients
INFO [StorageServiceShutdownHook] 2016-03-09 06:10:31,590 Gossiper.java (line 1279) Announcing shutdown
任何人都可以帮助我。当我使用 hector 1.0-5 读取数据时,不会发生此错误。但是在使用datastax java-driver core 2.0.5 读取数据时,出现了这个错误。那个驱动有问题吗?使用 thrift 和 cql 读取数据有什么区别吗?我的键空间是一个旧的,使用 cassandra-cli 创建的,它的模式是
create column family user_metrics_overview
with column_type = 'Standard'
and comparator = 'ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType)'
and default_validation_class = 'BytesType'
and key_validation_class = 'BytesType'
【问题讨论】:
-
JVM 无法分配直接缓冲区,您可能想增加它并尝试最有可能解决的问题。例如:-XX:MaxDirectMemorySize=256/512m 我相信默认是 64m。
-
我没有设置 -XX:MaxDirectMemorySize 参数。如果没有设置任何值,默认值是多少? @MadhusudanaReddySunnapu
-
我相信它依赖于 JVM,但对于 Sun/Oracle JVM,默认值为 64 MB。
-
这个节点有多少内存?我不认为墓碑是你的主要问题。
标签: java cassandra out-of-memory cassandra-2.0 datastax-java-driver