Кассандра - Сортировка данных для решения нумерации страниц?

Итак, у нас есть веб-приложение, использующее.NET с комбо Cassandra / Spark для создания онлайн-отчетов.

В настоящее время мы собираем все релевантные данные из Cassandra и отображаем их внутри таблицы через плагин JavaScript, который также сортирует их (в зависимости от нажатой колонки).

Например

PK = PARTITION KEY | CK = CLUSTERING KEY

   PK     PK         CK
-------------------------------------
| user | date  | application | time |
-------------------------------------
| A    | 17500 | app1        | 3000 |
| A    | 17500 | calc        | 1000 |
| A    | 17500 | word        | 5000 |
-------------------------------------

Однако возвращаемые данные становятся все больше и больше: поэтому нам нужно было разработать какую-то нумерацию страниц, чтобы избежать длительного запроса и времени загрузки интерфейса.
Скорее всего, столбец будет отсортирован по времени и, к сожалению, не является частью ключа кластеризации и поэтому не может использовать ORDER BY команда.

Решением, которое мы придумали, было создание таблицы "ранжирования" с теми же данными, например

   PK     PK      CK
--------------------------------------------
| user | date  | rank | application | time |
--------------------------------------------
| A    | 17500 | 1    | word        | 5000 |
| A    | 17500 | 2    | app1        | 3000 |
| A    | 17500 | 3    | calc        | 1000 |
--------------------------------------------

... но это привело бы к большей нагрузке на Spark, так как данные, собранные за "время", постоянно увеличиваются и, следовательно, меняют рейтинг.

Мы могли бы также упорядочить результаты на стороне сервера, кэшировать и получать ограниченные данные с помощью вызовов ajax, но этот метод значительно увеличивает загрузку памяти на сервере (особенно если многие пользователи используют систему одновременно).

Возможно, я обдумываю это, и вместо этого можно использовать простую конструкцию стола из кассандры. Как лучше всего решить эту проблему?


РЕДАКТИРОВАТЬ (15 декабря 2017 г.). В Cassandra появилось нечто, называемое Materialized Views, которое, похоже, может упорядочивать неключевые столбцы в качестве ключей кластеризации. Это было бы здорово для захвата большого количества строк и сортировки, но не для нумерации страниц.


РЕДАКТИРОВАТЬ (18 декабря 2017 г.): Драйвер Datastax C# позволяет разбивать результаты на страницы. Состояние пейджинга можно сохранить и продолжить при необходимости. Это вместе с Материализованными представлениями завершило бы нумерацию страниц.


РЕДАКТИРОВАТЬ (19 декабря 2017 г.) На самом деле, не искрившись в яме с фреймами данных с помощью spark - после настройки они невероятно быстро сортируются и фильтруются, обрабатывая их как SQL.
Ключевые слова: после настройки. Нашли, что на их создание ушло в среднем около 7 секунд.


РЕДАКТИРОВАТЬ (29 марта 2018 г.) Попасть в ловушку с текущим решением (Материализованное представление + ограничение результатов). Материализованное представление должно постоянно обновляться, что приводит к появлению дерьма надгробий. Это означает: плохая производительность кластера.
См. Раздел Сортировка результатов по некластерному ключу и надгробиям при обновлении.
Вернуться на площадь 1. вздох


РЕДАКТИРОВАТЬ (22 августа 2018 г.) Благодаря активным исследованиям: кажется, что путь к реализации заключается в реализации решения Solr. Solr обеспечивает мощный и быстрый индексированный поиск, а также пейджинг. Этот пост в блоге " Избегайте ловушек при масштабировании Cassandra " является хорошим ресурсом от разработчика Walmart, который объясняет решение о том, как они делали пейджинг с использованием "шардинга".

0 ответов

Прошло много времени с тех пор, как я задал этот вопрос, но хотел опубликовать некоторую информацию о текущем решении.

Ключи раздела являются "ключевыми".

Проектирование базы данных, так только те данные, которые вы хотите вернулись в вернулся.
Фильтрация по точному ключу раздела вместо фильтрации по ключам кластеризации значительно повысила производительность кластера. Теперь мы используем только 1 таблицу с одним ключом раздела вместо сотен таблиц с составными ключами. Также был реализован шардинг.

KAFKA Потоковая передача и кэширование данных

Одна из самых больших ошибок, с которыми мы столкнулись, заключалась в том, что база данных испытывала огромную нагрузку, связанную с постоянным обновлением данных, часто с вставкой повторяющихся строк. Это создавало проблемы с размером memtables и временем промывки, из-за которых узлы часто падали. https://docs.datastax.com/en/archived/cassandra/3.0/cassandra/dml/dmlHowDataWritten.html
Поэтому мы решили перейти на потоковую передачу вместо пакетной обработки (Spark).

Потоковая передача Kafka настолько быстра, что запросы Cassandra не выполняются до тех пор, пока темы больше не будут храниться в памяти. Оптимизированные темы Kafka передаются в промежуточную систему кэширования, сортируют данные с помощью Linq (C#) и хранят их там до истечения определенного периода времени. Данные извлекаются из этого кеша для подкачки.

Стриминг Spark тоже сработал бы для нас, но Kafka подошел лучше. Вот хорошая статья о различиях и о том, что может быть лучше для вас:
https://www.knowledgehut.com/blog/big-data/kafka-vs-spark

Другие вопросы по тегам