2016-06-04 3 views
3

Мы пытаемся использовать Apache Cassandra в приложении на основе IoT. Мы планируем создать абстракцию устройства. Любой пользователь должен иметь возможность определять устройство с рядом атрибутов. Для каждого атрибута пользователь должен иметь возможность определить ряд свойств, как имя, тип данных, минимальное значение, максимальное значение и т.д.Моделирование данных в cassandra для IOT

Некоторые примеры устройств приведены ниже

Vehicle

транспортное средство может иметь следующие атрибуты

  1. скорость [имя: - скорость, тип данных: - двойной, минимальное значение: - 0, максимальное значение: -300]
  2. Широта [имя: - скорость, данные: - двойная, минимум: - -90, максимум: -90]
  3. Долгота [имя: - долгота, данные: - двойная, минимум: - -180, максимальная: 180]

температурный датчик

датчик температуры может иметь следующие атрибуты

  1. текущая температура [название: - Текущий Temperation, тип данных: - двойной, мин Значение IMUM: - 0, максимальное значение: -300]
  2. Unit [имя: - Единица, тип данных: -string]

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

Для бывших: - A Автомобиль может отправить следующие данные

Время: - 6/4/2016 11: 15: 15.150, широта: -1,256, Долгота: - -180,75, Скорость: - 50

Время: - 6/4/2016 11: 15: 16,150, широта: -1,257, долгота: - -181,75, Скорость: - 51

Для ех: - датчик температурыможет послать следующее данные

Время: - 6/4/2016 11: 15: 15,150, Текущая температура: 100, Раздел: Фаренгейт

Время: - 6/4/2016 11: 15: 16.150, Широта: 101, Раздел: Фаренгейт

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

+0

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

+0

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

+0

Возможно, вы захотите взглянуть на мой проект IoT, это проект IoT/Casandra. https: //www.github.com/weaviate –

ответ

1

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

Пример CQL:

CREATE TABLE timeline (
    device uuid, 
    time timeuuid, 
    key text, 
    value blob, 
    … 
    PRIMARY KEY ((device, key), time) 
); 

Значения можно хранить в двоичных объектов (пользовательские сериализации), карта или числовые скаляры, в зависимости от использования конкретных & моделей доступа к данным приложений (как читать/write/delete и если вы планируете поддерживать обновления).

FYI полезное связанное Datastax сообщения о моделировании временных рядов:

1

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

Метод карты может быть осуществим, однако есть некоторые вещи, чтобы рассмотреть, прежде чем идти по этому пути:

Будет ли запись устройства получать частые обновления и как вы обновить его? Если вы планируете обновлять каждый элемент на карте, вам придется обновлять каждый элемент по отдельности. Причина этого в том, что перезапись на коллекциях в Cassandra создаст надгробную плиту диапазона для каждой перезаписи. Если вы часто переписываете, вы получите миллионы надгробных камней, которые, вероятно, в конечном итоге не будут сжиматься так эффективно, как вам хотелось бы. Этого можно избежать, используя вместо этого тип JSON и обрабатывая его в своем приложении.

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

Если вы еще этого не сделали, дайте этому блогу прочитать - он указывает основные элементы дизайна модели данных, которые вам нужно получить при использовании Cassandra. http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling