Apache Cassandra аварийно завершает работу при большой нагрузке на чтение

Я работаю над приложением, которое требует одновременной регулярной записи и массивного чтения.

Приложение хранит несколько текстовых столбцов небольшого размера и карту, которая является самым большим столбцом в таблице.

Работая с Phantom-DSL в Scala (драйвер Datastax Java ниже), мое приложение падает, когда размер данных увеличивается.

Вот лог из моего приложения.

[error] - com.websudos.phantom - All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.OperationTimedOutException: [/127.0.0.1:9042] Operation timed out))

А вот и журналы Cassandra.

Я разместил журналы Cassandra в pastebin, потому что они были довольно большими, чтобы их можно было встроить в ответы.

Я не могу понять причину этого сбоя. Я попытался увеличить время ожидания и отключить кэш строк.

Насколько я понимаю, это основная проблема, и ее можно решить, настроив cassandra для этого особого случая.

Мое использование cassandra происходит из разных источников данных. Так что пишет не очень часто. Но операции чтения имеют большой размер, поскольку одновременно может потребоваться более 300 тыс. строк, которые затем необходимо передавать по HTTP.


person chbh    schedule 12.10.2015    source источник
comment
У вас включен пейджинг в java-драйвере? Если нет, включите его. Если это так, попробуйте уменьшить размер страницы (я думаю, по умолчанию это 5 тыс. строк). Ваша проблема в том, что сборщик мусора JVM не справляется, возможно, из-за того, что вы одновременно загружаете слишком много данных в кучу.   -  person Tyler Hobbs    schedule 15.10.2015


Ответы (2)


Журналы показывают значительное давление GC (ParNew 5 секунд).

Когда вы говорите, что «чтения имеют большой размер, так как может потребоваться более 300 тыс. строк одновременно», вы имеете в виду, что извлекаете 300 тыс. строк в одном запросе? Драйвер Datastax поддерживает собственное разбиение по страницам — установите размер выборки значительно меньше (500 или 1000) и разрешите ему пролистывать эти запросы вместо того, чтобы пытаться загрузить все 300 тыс. строк за один проход?

person Jeff Jirsa    schedule 12.10.2015

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

person Stefan Podkowinski    schedule 12.10.2015
comment
Создание другой таблицы имело бы смысл, если бы мне приходилось запрашивать определенные строки. Но выполнение одного большого запроса означало бы выполнение нескольких запросов или, по крайней мере, получение большого количества данных и преобразование их в конце приложения, что также является чем-то очень дорогим. Я не держу более 100-150 элементов на карте. Я также обновил ответ своим вариантом использования. - person chbh; 12.10.2015