2013-11-07 2 views
0

Мы экспериментируем с использованием Cassandra в качестве нашего хранилища данных и столкнулись с проблемой, когда узлы не работают из-за нехватки места для кучи. Мы запускаем Datastax Community Edition с Cassandra 2.0.1 на 9 узловых кластерах, на которых запущен сервер Ubuntu 13.04 с 16 ГБ оперативной памяти на узел. Во время миграции данных два наших узла неожиданно упали из-за нехватки места кучи. Трассировки стека в журналах были довольно неопределенными и разнообразными. Вот пример одного из них:Cassandra OutOfMemoryError

ERROR [MutationStage:21] 2013-11-01 07:08:39,656 CassandraDaemon.java (line 185) Exception in thread Thread[MutationStage:21,5,main] 
java.lang.OutOfMemoryError: Java heap space 
    at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57) 
    at java.nio.ByteBuffer.allocate(ByteBuffer.java:331) 
    at org.apache.cassandra.utils.SlabAllocator$Region.init(SlabAllocator.java:178) 
    at org.apache.cassandra.utils.SlabAllocator.getRegion(SlabAllocator.java:101) 
    at org.apache.cassandra.utils.SlabAllocator.allocate(SlabAllocator.java:70) 
    at org.apache.cassandra.utils.Allocator.clone(Allocator.java:30) 
    at org.apache.cassandra.db.ColumnFamilyStore.internOrCopy(ColumnFamilyStore.java:2220) 
    at org.apache.cassandra.db.Column.localCopy(Column.java:277) 
    at org.apache.cassandra.db.Memtable$1.apply(Memtable.java:107) 
    at org.apache.cassandra.db.Memtable$1.apply(Memtable.java:104) 
    at org.apache.cassandra.db.AtomicSortedColumns.addAllWithSizeDelta(AtomicSortedColumns.java:195) 
    at org.apache.cassandra.db.Memtable.resolve(Memtable.java:196) 
    at org.apache.cassandra.db.Memtable.put(Memtable.java:160) 
    at org.apache.cassandra.db.ColumnFamilyStore.apply(ColumnFamilyStore.java:842) 
    at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:373) 
    at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:338) 
    at org.apache.cassandra.db.RowMutation.apply(RowMutation.java:201) 
    at org.apache.cassandra.db.RowMutationVerbHandler.doVerb(RowMutationVerbHandler.java:56) 
    at org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask.java:56) 
    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:724) 

До этого есть AssertionErrors так:

ERROR [FlushWriter:6176] 2013-11-01 06:55:48,825 CassandraDaemon.java (line 185) Exception in thread Thread[FlushWriter:6176,5,main] 
java.lang.AssertionError 
    at org.apache.cassandra.io.sstable.SSTableWriter.rawAppend(SSTableWriter.java:198) 
    at org.apache.cassandra.io.sstable.SSTableWriter.append(SSTableWriter.java:186) 
    at org.apache.cassandra.db.Memtable$FlushRunnable.writeSortedContents(Memtable.java:358) 
    at org.apache.cassandra.db.Memtable$FlushRunnable.runWith(Memtable.java:317) 
    at org.apache.cassandra.io.util.DiskAwareRunnable.runMayThrow(DiskAwareRunnable.java:48) 
    at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) 
    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:724) 

, а также убивание сообщений о состоянии сбора мусора, как так:

INFO [ScheduledTasks:1] 2013-11-01 06:59:14,923 GCInspector.java (line 116) GC for ConcurrentMarkSweep: 5935 ms for 1 collections, 2963961136 used; max is 3902799872 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,924 StatusLogger.java (line 55) Pool Name     Active Pending  Completed Blocked All Time Blocked 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,925 StatusLogger.java (line 70) ReadStage       0   3  58646672   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,925 StatusLogger.java (line 70) RequestResponseStage    0   1  22614351   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,925 StatusLogger.java (line 70) ReadRepairStage     0   0   76371   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,926 StatusLogger.java (line 70) MutationStage      7  260  709366463   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,926 StatusLogger.java (line 70) ReplicateOnWriteStage    0   0   104455   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,926 StatusLogger.java (line 70) GossipStage      0   1  3695467   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,953 StatusLogger.java (line 70) AntiEntropyStage     0   0   404   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,954 StatusLogger.java (line 70) MigrationStage     0   0   1178   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,954 StatusLogger.java (line 70) MemtablePostFlusher    1  39   43229   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,955 StatusLogger.java (line 70) MemoryMeter      0   0   668   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,955 StatusLogger.java (line 70) FlushWriter      0   0   23228   0    82 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,955 StatusLogger.java (line 70) MiscStage       0   0   196   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,956 StatusLogger.java (line 70) commitlog_archiver    0   0    0   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,956 StatusLogger.java (line 70) InternalResponseStage    0   0   276   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,956 StatusLogger.java (line 70) HintedHandoff      0   0    13   0     0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,956 StatusLogger.java (line 79) CompactionManager     3  11 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,957 StatusLogger.java (line 81) Commitlog      n/a  261 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,957 StatusLogger.java (line 93) MessagingService    n/a  1,0 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,957 StatusLogger.java (line 103) Cache Type      Size     Capacity    KeysToSave 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,957 StatusLogger.java (line 105) KeyCache     41783700    104857600      all 
INFO [ScheduledTasks:1] 2013-11-01 06:59:14,975 StatusLogger.java (line 111) RowCache       0      0      all 
... 

Учитывая, что это произошло только через 4 часа приема данных, мы задаемся вопросом, почему это произошло, и что мы можем сделать, чтобы это не повторилось. Заранее спасибо.

+0

На что установлен MAX_HEAP_SIZE? – Dave

+0

Устанавливается в 3761M (что я считаю по умолчанию, 1/4 от расчетной свободной памяти) – cbliu

+0

Ошибка утверждения указывает на ошибку в самой Cassandra. Ошибка, проявленная чем-то странным, вы, но все-таки ошибка. – Raedwald

ответ

-1

Был запущен Cassandra на Ubuntu в производстве в течение нескольких лет, и он очень чувствителен к настройкам ОЗУ. В общем случае не сохраняйте более 1 Тбайт данных на узел и избегайте работы с максимальной глубиной менее 8 ГБ.

См. «MAX_HEAP_SIZE» в /etc/cassandra/cassandra-env.sh.

Когда вы первоначально импортируете данные, он переходит в ОЗУ, затем уплотняется. Обычно рекомендуется установить максимальную кучу выше для первоначального запуска, а затем перезапустить с меньшим количеством кучи после полного завершения кластера.