Как загрузить сразу много данных в Cassandra & quot; кластер? одного узла?

Я работаю над системой с несколькими веб-сайтами, которая использует Cassandra для обработки всех своих потребностей в данных.

Когда я впервые устанавливаю веб-сайт, он добавляет 3918 страниц (и растет) со множеством полей, вложений, таких как файлы JS, ссылки между страницами и т. Д.

В какой-то момент мой тестовый «кластер» (один узел) решает, что данные поступают быстро, а время истекает или наихудшее, Cassandra «падает» из-за нехватки памяти (OOM). Более или менее, из того, что я вижу, 2 ГБ оперативной памяти, выделенной Cassandra, заполняется, и затем, чаще всего, Cassandra не контролирует доступную оперативную память и получает OOM. Когда я не получаю OOM, я получаю тайм-ауты.

Есть ли в драйвере C / C ++ вызов, чтобы узнать, медленен ли «кластер», поэтому я могу подождать некоторое время, вместо того, чтобы выдавать больше данных, как сумасшедшие?

На данный момент, единственное, что я могу видеть, это я делаю запись (INSERT INTO ...) и получить ошибку тайм-аута. Точнее, эта ошибка: CASS_ERROR_SERVER_WRITE_TIMEOUT, Я нахожу довольно уродливым ждать, пока я не получу такую ​​ошибку, чтобы начать расхаживать INSERTs для того, чтобы управлять нагрузкой. Это единственный способ ?!


Обновление: я смог избежать OOM, но только уменьшив количество плагинов, которые устанавливаются при первом создании сайта (мне не нужно устанавливать все плагины сразу). Если вы спросите меня, это не очень хорошее решение, потому что узел Cassandra НЕ должен просто так аварийно завершать работу. Это может (возможно, случается со многими) произойти в производстве, и недопустимо думать, что это может произойти, когда нагрузка слишком велика в течение минуты …

1

Решение

Что я лично делаю для загрузки большого количества данных — это использование асинхронных запросов (это в Python, но я думаю, что вы можете сделать то же самое в C ++). Я вставляю свои данные асинхронно и помещаю ответы в список.

Когда я набрал определенное число (в моем случае 1000), я просматриваю свой список и вызываю результаты всех моих ответов синхронно, пока все мои запросы не пройдут.

Таким образом, я могу отправлять множество запросов, не перегружая мой кластер. Не знаю, если это самый эффективный способ, но это хорошо работает.

2

Другие решения

Кластеры с одним узлом нетипичны (они не являются антипаттернами, но они не являются основным вариантом использования). Вам придется обойти некоторые традиционные способы поведения.

1) Используйте запросы синхронизации вместо асинхронных.

2) Убедитесь, что вы используете реальный уровень согласованности ( QUORUM ) даже на одном узле, как при использовании ANY позволит вам быть разбитым

3) Измерьте собственную задержку запроса. Если задержки увеличиваются, проходят определенную точку (если не считать полного тайм-аута), отмените скорость вставки (искусственный сон).

4) Настройте кассандровую сторону соединения. 2 ГБ довольно мало, для эффективной работы вам нужно будет немного поработать. Возможно, вы захотите настроить свои пороги запоминания памяти, чтобы стимулировать более частую очистку, и, возможно, явно сконфигурируете размеры памяти в зависимости от размера вашего исходного набора документов.

2

Увидеть Cassandra Loader глотать огромные данные в Кассандру.

0
По вопросам рекламы [email protected]