2013-12-12 2 views
1

У меня есть таблица, содержащая 1MB blobs.Cassandra OutOfMemoryError во время запроса диапазона

CREATE TABLE blobs_1 ( ключ текста, версия BigInt, кусок Int, object_blob блоб, object_size INT, PRIMARY KEY (ключ, версия, фрагмент) )

Каждый нескладеха будет распространяться на о 100 кусков. Следующий запрос приводит к ошибкам OutOfMemory:

выберите object_size из blobs_1 где key = 'key1' и version = 1;

Здесь ошибка:

java.lang.OutOfMemoryError: Java куча пространства на org.apache.cassandra.io.util.RandomAccessReader.readBytes (RandomAccessReader.java:344) в org.apache. cassandra.utils.ByteBufferUtil.read (ByteBufferUtil.java:392) на org.apache.cassandra.utils.ByteBufferUtil.readWithLength (ByteBufferUtil.java:355) в org.apache.cassandra.db.ColumnSerializer.deserializeColumnBody (ColumnSerializer. java: 124) at org.apache.cassandra.db.OnDiskAtom $ Serializer.deserializeFromSSTable (OnDiskAtom.java:85) at org.apache.cassandra.db.Column $ 1.computeNext (столбец) .java: 75) at org.apache.cassandra.db.Column $ 1.computeNext (Column.java:64) at com.google.common.collect.AbstractIterator.tryToComputeNext (AbstractIterator.java:143) at com. google.common.collect.AbstractIterator.hasNext (AbstractIterator.java:138) на org.apache.cassandra.db.columniterator.SimpleSliceReader.computeNext (SimpleSliceReader.java:88) на org.apache.cassandra.db.columniterator. SimpleSliceReader.computeNext (SimpleSliceReader.java:37) на com.google.common.collect.AbstractIterator.tryToComputeNext (AbstractIterator.java:143) на com.google.common.collect.AbstractIterator.hasNext (AbstractIterator.java:138) at org.apache.cassandra.db.columniterator.SSTableSliceIterator.hasNext (SSTableSliceIterator.java:82) на org.apache.cassandra.db.columniterator.LazyColumnIterator.computeNext (LazyColumnIterator.java:82) на org.apache.cassandra.db.columniterator.LazyColumnIterator.computeNext (LazyColumnIterator.java:59) в com.google. common.collect.AbstractIterator.tryToComputeNext (AbstractIterator.java:143) at com.google.common.collect.AbstractIterator.hasNext (AbstractIterator.java:138) at org.apache.cassandra.db.filter.QueryFilter $ 2.getNext (QueryFilter.java:157) at org.apache.cassandra.db.filter.QueryFilter $ 2.hasNext (QueryFilter.java:140) at org.apache.cassandra.utils.MergeIterator $ Candidate.advance (MergeIterator.java: 144) at org.apache.cassandra.utils.MergeIterator $ ManyToOne.advance (MergeIterator.java:123) at org .apache.cassandra.utils.MergeIterator $ ManyToOne.computeNext (MergeIterator.java:97) на com.google.common.collect.AbstractIterator.tryToComputeNext (AbstractIterator.java:143) на com.google.common.collect.AbstractIterator .hasNext (AbstractIterator.java:138) at org.apache.cassandra.db.filter.SliceQueryFilter.collectReducedColumns (SliceQueryFilter.java:185) at org.apache.cassandra.db.filter.QueryFilter.collateColumns (QueryFilter.java : 122) на org.apache.cassandra.db.filter.QueryFilter.collateOnDiskAtom (QueryFilter.java:80) в org.apache.cassandra.db.RowIteratorFactory $ 2.getReduced (RowIteratorFactory.java:101) в орг. apache.cassandra.db.RowIteratorFactory $ 2.getReduced (RowIteratorFactory.java:75) at org.apache.cassandra.utils.MergeIterator $ ManyToOne.consume (MergeIterator.java:115) at org.apache.cassandra.utils.MergeIterator $ ManyToOne.computeNext (MergeIterator.java: 98)

+0

Это происходит на 2.0.2. Разочарование того, что один запрос сбрасывает сервер так легко. – user3025533

ответ

0

Ошибка возникает из-за того, что Cassandra десериализует больше данных, чем необходимо, после чтения одного столбца таблицы (по крайней мере, Cassandra 1.2, возможно, это было улучшено в ветви 2.0).

Для устранения проблемы вы можете ввести отдельную таблицу для метаданных (размеры и т. Д.). Это немного замедлится, но значительно улучшит производительность чтения.

2

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

https://github.com/datastax/java-driver/blob/2.0/driver-core/src/main/java/com/datastax/driver/core/Statement.java#L234

+0

Я также создал https://issues.apache.org/jira/browse/CASSANDRA-6492, чтобы автоматизировать это. – jbellis

+0

Поскольку это происходит в cqlsh, java-драйвер не поможет. Итак, нет способа избежать выборки капли, если мне нужен только object_size? Я мог бы перемещать «object_size» в другую таблицу, но такая же проблема возникает, когда я пытаюсь извлечь «кусок», который является частью первичного ключа, и это нельзя перенести в другую таблицу. – user3025533

Смежные вопросы