Кассандра данных моделирования BLOB-объектов - PullRequest
0 голосов
/ 12 апреля 2019

Я думаю об использовании кассандры для хранения моих данных.У меня есть server_id, start_time, end_time, messages_blob.

CREATE TABLE messages (
    server_id uuid,
    start bigint,
    end bigint,
    messages_blob blob,

    PRIMARY KEY ((server_id), start,end)
) WITH CLUSTERING ORDER BY (start,end);

У меня есть два типа запросов:

  1. получить все server_ids и messages_blob во время запуска> 100 и время начала <300. </li>
  2. получить все messages_blob для группы server_ids одновременно.

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

1 Ответ

0 голосов
/ 12 апреля 2019

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

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

Для выполнения этого запроса у вас есть несколько вариантов.

Добавьте еще одну таблицу, в которой ключ разделения будет start, и вы сможете хранить первичные ключи записей в первой таблице.Примерно так:

create table lookup (start bigint, server_id uuid, end bigint, 
   primary key(start, server_id, end));

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

Используйте Spark для сканирования таблицы - поскольку у вас start в качестве первого столбца кластеризации, тогда Spark сможет выполнять предикаты pushdown,и фильтрация произойдет внутри Касасндры.Но это будет гораздо медленнее, чем использование справочной таблицы.

Кроме того, будьте очень осторожны с каплями - Cassandra плохо работает с большими каплями, поэтому если у вас есть капли размером более 1 МБ, вам понадобитсяразделить их на несколько частей или (лучше) сохранить их в файловой системе или другом хранилище, например, S3, и хранить в Cassandra только метаданные.

...