WedX - журнал о программировании и компьютерных науках

Ключ раздела Cassandra для данных временных рядов

Я тестирую Кассандру как базу данных временных рядов.

Я создаю модель данных, как показано ниже:

CREATE KEYSPACE sm WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 1
};

USE sm;

CREATE TABLE newdata (timestamp timestamp,
  deviceid int, tagid int,
  decvalue decimal,
  alphavalue text,
  PRIMARY KEY (deviceid,tagid,timestamp));

В первичном ключе я установил deviceid в качестве ключа раздела, что означает, что все данные с одинаковым идентификатором устройства будут записываться в один узел (означает ли это один компьютер или один раздел. Каждый раздел может иметь максимум 2 миллиарда строк), также если я запрашиваю данные в тот же узел, поиск будет быстрым, я прав? Я новичок в Cassandra и немного запутался в ключах раздела и кластеризации.

Большая часть моего запроса будет выглядеть следующим образом:

  • выберите последнюю временную метку известных идентификаторов устройств и тегов
  • Выберите десятичное значение известного идентификатора устройства, идентификатора тега и отметки времени.
  • Выберите альфа-значение известного идентификатора устройства, идентификатора тега и отметки времени
  • выберите * из известных идентификаторов устройств и тегов с временным диапазоном
  • выберите * известного идентификатора устройства с временным диапазоном

У меня будет около 2000 идентификаторов устройств, у каждого идентификатора устройства будет 60 пар тегов / значений. Я не уверен, что это будут широкие строки с идентификатором устройства, отметки времени, идентификатора тега / значения, идентификатора тега / значения ....

16.03.2016

Ответы:


1

Я новичок в Cassandra и немного запутался в ключах раздела и кластеризации.

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

Каждый раздел может содержать не более 2 миллиардов строк.

Это не совсем так. Каждый раздел может поддерживать до 2 миллиардов ячеек. Ячейка - это, по сути, пара имени столбца / значения. И ваши ключи кластеризации сами по себе составляют одну ячейку. Поэтому вычислите свои ячейки, подсчитав значения столбцов, которые вы храните для каждой строки CQL, и добавьте еще одну, если вы используете столбцы кластеризации.

В зависимости от вашей широкой строковой структуры вы, вероятно, будете иметь ограничение гораздо меньше, чем 2 миллиарда строк. Вдобавок это всего лишь ограничение на объем памяти. Даже если вам удалось сохранить 1 миллион строк CQL в одном разделе, запрос этого раздела вернет так много данных, что это будет неудобно и, вероятно, приведет к тайм-ауту.

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

По крайней мере, это будет быстрее, чем запросы с несколькими ключами, которые обращаются к нескольким узлам. Но будет ли это «быстрым», зависит от других вещей, например от ширины ваших строк и от того, как часто вы выполняете такие действия, как удаление и обновление на месте.

Большая часть моего запроса будет выглядеть следующим образом:

select lastest timestamp of know deviceid and tagid
Select decvalue of known deviceid and tagid and timestamp
Select alphavalue of known deviceid and tagid and timestamp
select * of know deviceid and tagid with time range
select * of known deviceid with time range

Ваша текущая модель данных может поддерживать все эти запросы, кроме последнего. Чтобы выполнить запрос диапазона на timestamp, вам необходимо скопировать данные в новую таблицу и создать ПЕРВИЧНЫЙ КЛЮЧ для поддержки этого шаблона запроса. Это называется «моделированием на основе запросов». Я бы построил такую ​​таблицу запросов:

CREATE TABLE newdata_by_deviceid_and_time (
  timestamp timestamp,
  deviceid int,
  tagid int,
  decvalue decimal,
  alphavalue text,
  PRIMARY KEY (deviceid,timestamp));

Эта таблица может поддерживать запрос диапазона на timestamp при секционировании на deviceid.

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

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

CREATE TABLE newdata_by_deviceid_and_time (
  timestamp timestamp,
  deviceid int,
  tagid int,
  decvalue decimal,
  alphavalue text,
  monthbucket text,
  PRIMARY KEY ((deviceid,monthbucket),timestamp));

Теперь, когда я хотел запросить данные для определенного устройства и определенного диапазона дат, я бы также указал monthbucket:

SELECT * FROM newdata_by_deviceid_and_time
WHERE deviceid='AA23' AND monthbucket='201603'
AND timestamp >= '2016-03-01 00:00:00-0500'
AND timestamp < '2016-03-16 00:00:00-0500';

Помните, monthbucket - это просто пример. Для вас может иметь смысл использовать квартал или даже год (при условии, что вы не храните слишком много значений на deviceid в год).

17.03.2016
  • Большое спасибо, Аарон! это действительно помогло ... Я сделаю то, что вы предлагаете, я также попытаюсь урезать часть моей модели данных, потому что в некоторых случаях кассандра потребляет CPU, RAM, IO и хранилище намного выше, чем Mongo. 17.03.2016
  • Привет, Аарон, чтобы оптимизировать эту модель данных, могу я как-нибудь создать таблицу с помощью map {'tagid1': value1, 'tagid2': value2}. Могу ли я снизить потребность в оборудовании, сделав это, не потеряв при этом производительности? 17.03.2016
  • @PhuongLe Нет, вы не получите никакой производительности, если сохраните все данные на карте или в составной строке. 18.03.2016
  • В ключе раздела, могу ли я сопоставить deviceid со столбцом, который будет автоматически увеличиваться, когда количество ячеек достигнет 1 миллиарда или что-то в этом роде? есть ли какая-нибудь функция или методика подсчета клеток? Спасибо 18.03.2016
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]