Моделирование данных временных рядов Cassandra и ограничение размера раздела

В настоящее время мы исследуем Cassandra как базу данных для системы больших временных рядов.

Я прочитал https://academy.datastax.com/resources/getting-started-time-series-data-modeling о моделировании данных временных рядов в Cassandra.

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

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

Мы хотели бы, чтобы для каждого (weather_station_id, year, day_of_year) была одна строка, то есть новая строка для каждого дня. Однако мы по-прежнему хотим, чтобы ключ раздела был weather_station_id, то есть мы хотим, чтобы все показания для станции находились на одном узле.

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

CREATE TABLE weather_station_data (
    weather_station_id int,
    year int,
    day_of_year int,
    time timestamp,
    sensor_id int,
    temperature int,
    humidity int,
    light int,
    PRIMARY KEY ((weather_station_id), year, day_of_year, time, sensor_id)
) WITH CLUSTERING ORDER BY (year DESC, day_of_year DESC, time DESC,       sensor_id DESC);

В вышеупомянутом документе они используют концепцию «ограничить разделение строк по дате». Однако мне неясно, является ли дата в их примерах частью ключа раздела.


person dacox    schedule 19.04.2016    source источник
comment
Мне любопытно, температура, влажность и свет определены как целые числа, чтобы сохранить фиксированную точность? Другими словами, жестко ли запрограммирована точность в коде приложения?   -  person Sergei Rodionov    schedule 19.04.2016
comment
Это не моя настоящая модель данных, а просто пример аналогичной.   -  person dacox    schedule 19.04.2016


Ответы (2)


Согласно руководству, если мы выберем в качестве единственного раздела weather_station_id, строка будет исчерпана. то есть C * имеет практическое ограничение в 2 миллиарда столбцов на раздел.

Итак, IMO, ваша модель данных плохая.

Однако мне неясно, является ли дата в их примерах частью ключа раздела.

Используемый учебник

PRIMARY KEY ((weatherstation_id,date),event_time)

Итак, да, они считали данные частью ключа раздела.

мы хотим, чтобы все показания станции были на одном узле.

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

select * from weather_station_data where weather_station_id=1234 and year= 2013; select * from weather_station_data where weather_station_id=1234 and year= 2014;

Так что подумайте об изменении вашей структуры на

PRIMARY KEY ((weather_station_id, year), day_of_year, time, sensor_id)

Надеюсь, это поможет!

person chaitan64arun    schedule 20.04.2016
comment
Это действительно помогает, но мне все еще любопытно. Это единственный способ ограничить длину строки для изменения ключа раздела? Я чувствую, что должен быть способ сопоставить каждую станцию ​​с ее собственным разделом, но все же создавать новые строки для каждого дня или месяца и т. Д. - person dacox; 21.04.2016

На мой взгляд, модель datastax не очень хороша. Проблема с этой моделью:

  • Они используют метеостанцию ​​как ключ раздела. Все строки с одним и тем же ключом раздела хранятся на одной машине. Это означает: если у вас есть необработанные данные за 10 лет (с шагом 100 мс), вы очень быстро превысите лимит кассандр. 10 лет × 365 дней × 24 часа × 60 мин × 60 секунд × 10 (с шагом 100 мс) × 7 столбцов. Предел составляет 2 миллиарда. На мой взгляд, вы не воспользуетесь преимуществами cassandra, если построите эту модель данных. Вы также можете использовать для каждой метеостанции базу данных mongo, mysql или другую.

Лучшее решение: спросите себя, как вы будете запрашивать эти данные. Если вы скажете: «Я запрашиваю все данные за год», используйте год в качестве ключа разделения. Если вам также нужно запросить данные за более чем один год, вы можете создать два запроса с разным годом. Это работает, и производительность лучше. (Узкое место может быть только в сети для вашего клиента)

  • Еще один совет: Кассандра не похожа на mysql. Это денормализованная база данных. Это означает: сохранение данных более одного раза не является грязным. Это означает: важно, чтобы вы запрашивали свои данные за год, также важно запрашивать данные за час, за день в году или за sensor_id, вы можете создавать семейства столбцов с другим ключом раздела и порядком равных ключей. Дублировать ваши данные - это нормально. Cassandra оптимизирована для записи, а не для чтения. Это означает: часто лучше записывать данные в правильном порядке, чем читать их в правильном порядке. В cassandra 3.0 есть новая функция, называемая материализованными представлениями, для автоматического дублирования. И если вы подумаете: оооо, нет, я продублирую необходимое хранилище. Помните: хранение действительно дешево. Можно купить десять жестких дисков по 1 ТБ. Это ничего не стоило. Производительность важна.

У меня к вам один вопрос: можете ли вы агрегировать свои данные? У Кассандры есть тип столбца, называемый счетчиком. Вы можете создать приложение java / scala, в котором ваши данные будут агрегироваться во время их создания. Для этого вы можете использовать потоковую платформу: Flink или Spark. (Если вам нужно немного больше, чем просто подсчет.) Один сценарий: вы собираете данные за каждый час и каждый день. У вас есть данные в потоковом приложении. Теперь: у вас есть переменная для почасовых данных. Вы считаете вверх или вниз или что-то еще. Если час истекает, вы помещаете эту строку в семейство почасовых столбцов и семейство столбцов за день. В вашем ежедневном семействе столбцов вы используете счетчик. Надеюсь, вы понимаете, о чем я.

person Citrullin    schedule 20.04.2016
comment
Привет, Филипп, спасибо. Я знаю жесткое ограничение в 2 миллиарда для каждого ключа раздела. Мой вопрос касался способов ограничения длины строки, например, по дням или годам. Во втором примере в документе datastax они ограничивают длину строки датой. Однако похоже, что они делают это, делая его частью ключа раздела. Мой вопрос заключался в том, можно ли создавать новую строку для каждого дня, но все же сопоставить ее с узлом, основанным исключительно на идентификаторе метеостанции для разделения. - person dacox; 20.04.2016
comment
Вы хотите обойти ограничение в 2 миллиарда? Это мягкий лимит в 2 миллиарда. Но прежде чем вы получите 2 миллиарда строк x столбцы, вы столкнетесь с тайм-аутом на уровне чтения. Лучше для вас: используйте идентификатор станции и год в качестве ключа раздела. В результате получается только 29030400 строк (1 секунда). Если вам нужно больше одного года: напишите еще один запрос. Это не большая проблема. - person Citrullin; 08.05.2016
comment
То, что вы называете проблемой в первом пункте, является частью статьи о сборщике данных. Второй метод в статье описывает, как можно разделить данные с помощью даты. - person Demetris; 02.01.2017