2013-04-08 8 views
2

Мы немного экспериментируем с Cassandra, опробовав некоторые из длинных тестовых примеров (стресс-тест), и мы испытываем некоторые проблемы с памятью на одном узле кластера при в любое время (это может быть любая машина на кластере!)Cassandra испытывает проблемы OutOfMemory (Java Heap Space) на длинных прогонах

Мы запускаем сообщество DataStax с Cassandra 1.1.6 на компьютере с Windows Server 2008 и 8 ГБ ОЗУ. Кроме того, мы настроили размер кучи на 2 ГБ против значения по умолчанию 1 ГБ.

Отрывок из журнала:

java.lang.OutOfMemoryError: Java куча пространства

демпинг кучу, чтобы java_pid2440.hprof ...

вороха файл дампа создан [1117876234 байт в 11.713 секунд ]

ОШИБКА 22: 16: 56756 Исключение в нити резьбы [CompactionExecutor: 399,1, основная]

java.lang.OutOfMemoryError : Java куча пространства

в org.apache.cassandra.io.util.FastByteArrayOutputStream.expand (FastByteArrayOutputStream.java:104)

на org.apache.cassandra.io.util.FastByteArrayOutputStream.write (FastByteArrayOutputStream. Java:. 220)

в java.io.DataOutputStream.write (Unknown Source)

Любые указатели/помощь и исправить это ??

+0

Не могли бы вы дать более подробную информацию о том, что вы вставляете и где вы его подставляете (ключ, имена столбцов и т. Д.)? какие настройки вы использовали для объявления кластера и кластеров? любые детали могут быть релевантными. –

+0

Я создаю пространство ключей со следующей командой: CREATE KEYSPACE T_V_0 с местом размещения_стратегии = 'org.apache.cassandra.locator.SimpleStrategy 'и strategy_options = {replication_factor: 1}; –

+0

Столбцы в основном имеют DateType, UUIDType, 3 IntegerType, 2 LongType и 1 DoubleType с \t С компаратор = UTF8Type \t И key_validation_class = UTF8Type \t И default_validation_class = UTF8Type –

ответ

3

Вы делаете правильные вещи, дав длинные тесты нагрузок, но в производственном случае вы не будете писать такие данные.

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

Существует также жесткий предел в 2 миллиарда колонок за строку, но на самом деле вы никогда не должны позволять рядам расти так широко. Создайте их, добавив имя дня или сервера или другое значение, общее для вашего набора данных, к вашим клавишам строк.

Для рабочей нагрузки «write-often read-почти-never» у вас могут быть очень широкие ряды, но вы не должны приближаться к отметке столбца 2 миллиарда. Держите его в миллионах с bucketing.

Для записи/чтения смешанной рабочей нагрузки, где вы читаете целые строки, часто даже сотни столбцов могут быть слишком большими.

Если вы рассматриваете право Кассандры правильно, вы будете легко обрабатывать тысячи чтений и записей в секунду на узел. Я вижу около 2.5k чтение и запись одновременно на узел в моем основном кластере.

+0

Я увеличил размер кучи JAVA до 4 ГБ и улучшил пропускную способность записи. Также, как вы правильно сказали, у меня очень широкие ряды (временные данные за каждый день). Я мог бы подумать о том, что изменение детализации может составлять каждый час, а не 24 часа. В противном случае строки могут стать действительно большими. –

+0

Как вы думаете, в этом случае может помочь обратный компаратор? –

+1

Не увеличивайте размер кучи, если вы не уверены, что понимаете, почему вы это делаете. Увеличение размера кучи во-первых увеличит время паузы для сборщиков мусора, что часто ухудшает ситуацию, во-вторых, отвлекает память от кеша файла ядра, что, по крайней мере, для меня в Linux оказалось намного быстрее, чем кэши Cassandra, и, наконец, для вашего сценария будет только отсрочка OOM , не мешает ему. Записывать что-либо в файле cassandra-env - плохая идея, если вы не поймете, почему вы это делаете. – tommyvn