Cassandra сохраняет временные ряды для отраслевых датчиков данных

В настоящее время я разрабатываю проект и исследую лучший способ получения данных от промышленных заводских датчиков, подключенных к ПЛК (контроллер оборудования на заводе, например, управляющие двигатели, скорости, переключатели...).

Я объясню цель, которую нужно достичь, и я думаю, что мой случай можно экстраполировать на очень разные отрасли:

  1. У меня есть несколько ПЛК, которые дают мне много разных значений данных. (Многие из этих значений являются только логическими значениями, а другие являются аналоговыми значениями, например, реальным типом.)

  2. У меня будет более 10 000 датчиков на всей фабрике.

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

  4. Для цифровых значений данные будут сохранены с отметкой времени при появлении события.

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

Мой вопрос касается сохранения аналоговых значений каждую секунду. Лучше иметь такую ​​схему:

метка времени, датчик1, датчик2, датчик3, датчик4

и рядить и группировать по частям на заводе или лучше так

у каждого датчика своя таблица

?

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


person Guel135    schedule 18.11.2014    source источник
comment
Какие-нибудь обновления с тех пор, как вы опубликовали этот вопрос, о том, как вы решили эту проблему?   -  person Arun Jose    schedule 23.07.2015


Ответы (2)


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

Означает ли это, что вы каждую секунду запрашиваете все датчики 10 000? Или для конкретного датчика, или для группы датчиков? В cassandra очень важно знать, какой у вас запрос, прежде чем смотреть на модели данных. Если вы ищете 1-секундную детализацию, одним из вариантов может быть передача входящих потоков данных в Spark Streaming и сохранение кода Spark Streaming в таблице Cassandra, которая соответствует тому, что вы хотите запросить.

Что касается вариантов, которые вы упомянули, трудно сказать, не зная точного характера ваших запросов. Вариантом может быть подключение одного ключа ко второму — это будет означать 10 КБ или около того записей на раздел, предполагая скорость передачи данных или 1/с на датчик. Было бы странно иметь таблицу для каждого датчика, но у вас может быть раздел для каждого датчика с отметками времени для каждой записи. Это действительно зависит от вашего запроса.

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

person ashic    schedule 18.11.2014
comment
Спасибо за быстрый ответ. Я хочу сохранить данные датчика, но я не создал запросы, на которые я буду подавать заявку. Единственными данными, которые я точно буду запрашивать, будут аналоговые значения в графике, такие как бегущие строки акций (вы выбираете время, день, месяц и видите график), но я действительно не знаю, какие из этих данных будут отображаться в то же самое время. время или нет. - person Guel135; 18.11.2014
comment
Боюсь, вам нужно кое-что знать о ваших запросах. Вы упомянули, что укажете время, день и месяц... вы также укажете датчики или набор датчиков? Какова гранулярность времени? Если это секунда, и вы не ожидаете сотен тысяч событий в 2-секундном окне, то ((день, час, секунда), sensor_id) может быть хорошим первичным ключом. Бу опять же, не зная вопросов, кидаем в неизвестность. Я бы на самом деле проанализировал требования, чтобы увидеть, какие запросы нужны. Моделирование на основе запросов — это изменение мышления, но оно жизненно важно для cassandra. - person ashic; 18.11.2014
comment
спасибо, ashic, как мы сказали в Испании, это как построить дом с крыши. Мне нужно передумать, и позже я смогу построить для этого подходящую систему. Но я сталкиваюсь с проблемой, что мы не знаем, какие данные будут использоваться позже, и это вызывает у меня проблему с разработкой базы данных на Cassandra. - person Guel135; 18.11.2014
comment
это не обязательно проблема с Кассандрой. Даже с, скажем, SQL Server, если вы моделируете без каких-либо представлений о том, какими будут ваши запросы, вы, вероятно, столкнетесь с проблемами производительности и очень сложными запросами. В Cassandra переход от концептуальной модели к фактической физической модели обычно весьма значителен. Но в то же время хорошо спроектированная база данных SQL будет знать, какие запросы она может и не может эффективно поддерживать. - person ashic; 18.11.2014

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

Некоторые вероятные таблицы, которые вы могли бы написать:

CREATE TABLE factory_status (
  date timestamp,
  hour int,
  minute int,
  second int,
  sensor_status_map map<uuid, float>
  PRIMARY KEY ((date, hour, minute, second))
)

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

CREATE TABLE sensor_status (
  sensor_id uuid,
  date timestamp,
  time timestamp,
  sensor_val float,
  PRIMARY KEY ((sensor_id, date), time)
)

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

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

person mildewey    schedule 19.11.2014
comment
прежде всего за этот интересный ответ. Теперь я понял. Один несколько вопросов: есть ли ограничения при снижении производительности, например, в количестве столбцов? или, как я вижу в вашем первом подходе, размещение карты в ряд будет более простым подходом, а также настолько гибким для меня (добавление новых данных датчика - это нормально). - person Guel135; 20.11.2014
comment
Cassandra очень эффективно обрабатывает широкие строки. Количество столбцов не сильно повлияет на скорость. Запрос подмножества столбцов также эффективен. Существуют некоторые проблемы с потоковой передачей, когда необработанный объем запрашиваемых данных становится очень большим (более 2 МБ). Предполагая одно значение или даже небольшое количество значений для каждого датчика, я был бы удивлен, если бы вы столкнулись с этой проблемой с 10 000 датчиков (при 100 000 это может быть более серьезной проблемой). - person mildewey; 20.11.2014