2017-01-04 2 views
-1

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

Всякий раз, когда я получаю новые данные, я читаю строку текущего часа, суммирую ее с полученными данными и записываю обратно. Я использую эти данные для генерации почасовых отчетов.

Это работает отлично с данными с низкой скоростью, но я наблюдал значительно большую потерю данных, когда скорость очень высокая (например, 100 записей для 1 пользователя в минуту). Это происходит потому, что чтение и запись происходят очень быстро, и из-за «задержки записи» я не получаю обновленные данные.

Я думаю, что мой подход «заполнить перед записью» сам по себе не так. Я думал о UDF, но я не уверен, как это повлияет на производительность.

Каков наилучший способ хранения агрегированных данных в Кассандре?

+0

Какие агрегаты и сколько будет агрегировано при чтении. Как часто он читает? Рассматривали ли вы их агрегацию в пакетах, таких как Spark Streaming? –

+0

В моей тестовой среде я пишу 200 записей за несколько секунд (написал скрипт, который непрерывно отправляет данные). Я читаю строку перед каждой вставкой. Я запускаю этот скрипт каждые 5 мин. Но в производственной среде я ожидаю более высокую скорость, чем это. В худшем случае одновременно может появиться 1000 записей. – RhishiM88

+0

«Лучшие практики» не по теме ** Мнение основано ** и ** слишком широко ** Пожалуйста, прочитайте [Какие типы вопросов я должен избегать?] (Http://stackoverflow.com/help/dont-ask) прежде чем пытаться задать больше вопросов. –

ответ

0

Моя идея была бы:

  • модели данных Cassandra на час за часом ведра.
  • Хранить простые данные в Кассандре немедленно, когда они прибудут.
  • процесса в X все данные X-1 час и сохранить совокупный результат на другом столе

Это позволит вам иметь очень быстрые входящие ставки, данные процесса только один раз, хранить агрегаты в другой для быстрого чтения.

0

Я использую Cassandra для предварительной агрегации. У меня разные таблицы для почасовых, ежедневных, еженедельных и ежемесячных. Я думаю, что вы, вероятно, получаете потерю данных, когда вы выбираете данные до того, как ваши последние вставки будут реплицированы на другие узлы.

Загляните в counter data type, чтобы обойти это.

Вы также можете указать более высокий уровень согласованности в вставках или выбрать, чтобы обеспечить получение последних данных.

+0

Даже у меня будут разные таблицы для почасовых, ежедневных, еженедельных и ежемесячных отчетов. Проблема заключается в том, что у меня есть 10 разных типов отчетов, и каждый тип отчетов будет содержать почасовые, ежедневные, еженедельные и ежемесячные фильтры. Было бы разумно создать так много таблиц? – RhishiM88

+0

4 денормализованных таблицы за отчет не звучат слишком плохо для меня. Если бы вы были на Cassandra 3.0+, вы могли бы взглянуть на материализованные виды. –