powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
6 сообщений из 6, страница 1 из 1
Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
    #39916687
askabout
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Имеется объект (например, здание) который содержит набор потребителей электроэнергии (комната, лифтовое оборудование, освещение коридоров и т.д.), у большинства потребителей установлены приборы учета (ПУ) электроэнергии. Измерения выполняются 1 раз в минуту. Измеряются несколько параметров: расход электроэнергии за эту минуту, мгновенные значение тока и напряжения. Потребителей несколько сотен (300) и потенциально зданий может быть много до 10000.

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

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

Каждый прибор измерений имеет некоторое описание (метаданные):
- здание (справочник, ссылка на здание)
- название (= номер комнаты)
- этаж (справочник этажей здания: 1,2,3-й и т.д.)
- тип (справочник производственное, хозяйственное, жилое и т.д.)

По каждому зданию требуются иметь следующий набор информации ( структуру потребления ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Суммарное потребление всего здания
   Удельное потребление электроэнергии на комнату
   Этажное потребление
     потребелние этажа 1
     потребление этажа 2
     ….
   Подъездное потребление
      потребление подъезда 1
      потребление подъезда 2
      …
   Потребление по группам потребителей:
      суммарное по хозяйственным
      суммарное по производственным
      суммарное по жилым
      суммарное по лифтовому оборудованию

Для хранения данных измерений, полученных от приборов учета, планируется использовать TimescaleDB или ClickHouse.

Основным камнем преткновения является следующее:

1. данные "доходят", то есть могу прийти задним числом (через несколько дней от даты измерений)

2. структура потребления (правила по которым нужно выполнять анализ/визуализацию) может меряться довольно часто: несколько раз в месяц. Исходные минутные данные о потреблении (от приборов) хранятся несколько лет. Схем может быть несколько, например, группы составлены по другим признакам точек.

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

В чем вопрос?

- Есть ли устоявшаяся best practice для решения подобного рода задач?

- Можно ли придумать решение такое, чтобы при отображения данных по структуре потребления объекта (за год с разбивкой по месяцам) так, чтобы не нужно было пересчитывать (сохранять в БД), а так чтобы расчет выполнялся "налету" по запросу с уровня приложений?

- Если перенести логику вычислений на приложение (в некий сервис getData) и вычислять все "налету" полагаясь при этом на возможности СУБД - на агрегацию (свертку) данных с минутных значений до месячных в рамках запросов - на сколько велика будет деградация производительности в далекой перспективе?

- На сколько утопична идея реализации выполнения «налету»?

- При необходимости выполнить сравнительный анализ объектов по показателю "удельное потребеление ЭЭ на комнату" пользователю требуется вывести результаты в таблице на странице (или отчете) и чтобы ее сформировать придется либо выполнить запрос в предрасчитанные данные (будет быстро) либо выполнить N запросов по каждому объекту для формирования единого списка... Как лучше выполнить реализацию для такого анализа?
...
Рейтинг: 0 / 0
Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
    #39916701
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askabout
Есть ли устоявшаяся best practice для решения подобного рода задач

Под такое есть как минимум time series бд.
askabout
Можно ли придумать решение такое

На промежуточном ПО можно всё. Благословляю.
askabout
на сколько велика будет деградация производительности в далекой перспективе

Hashmap жабки будет работать быстрее, чем любая субд, потому что там тормозить нечему. Тут вопрос сохранности и консистентности, а не производительности.
askabout
На сколько утопична идея реализации выполнения «налету»

Нормальная идея. Рассовываешь по удобным для тебя структурам, да суммируешь. Параллельно скидываешь в базу. Иногда проверяешь, чтобы всё сходилось.
askabout
Как лучше выполнить реализацию для такого анализа?

Делай всё на приложении + база, как хранилище.
...
Рейтинг: 0 / 0
Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
    #39918995
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askabout,

пока звучит как стандартная задачка под реалтайм аналитику. обычно такое строят с писаниной с клиентов в очередь, типа kafka, а из кафки читают чем-то типа spark на кластере. спарк (spark streaming) на лету показатели агрегирует и держит сколько возможно в памяти. дальше агрегаты пишутся в какой-нить подходящий сторидж. как я понимаю у спарка есть конектор к ClickHouse.
...
Рейтинг: 0 / 0
Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
    #39919119
askabout
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
H5N1,

Спасибо, за наводку про Apache Spark! Действительно мощная штука, еще не смотрели плотно в ее сторону. С первого взгляда это монструозная, замкнутая эко система для выполнения расчетов и анализа в распределённом режиме, то есть некая вещь в себе, так что к ней можно обращаться с конкретным вопросом, но не как СУБД (могу ошибаться).

У нас часто с данными работают аналитики, которые желают джойнить оперативные данные с мастер-данными для их насыщения, а в идеале работать например с месячными значениями (собранными из секундных интервалов), но так чтобы не заботиться о том чтобы эти свертки (из секунд в месяцы) обслуживать нашим кодом. Поэтому использование сервисов к которым можно задавать вопросы, но нельзя джойнить мастер-данные (тот же clickhouse) сейчас рассматриваются в меньшем приоритете (пока есть надежда найти решение с джойнами).

Процесс обработки исходных данных (теоритически) сейчас выглядит примерно так:
  • Получить и сохранить «как есть» секундные значения (Hypertable)
  • Автоматически: сформировать свертки в часовые, месячные значения (Continuous Aggregates)
  • Разработать сервис для клиента, который получает на вход интересующая его дискретизация (от этого зависит, на каких данных будет строиться запрос: секунды, часы, сутки) и в соответствии со алгоритмом проводит вычисления (C#) для узлов дерева расчета
  • Разработать клиента (angular) который бы реализовывал стандартные для любого расчета функции: отображал дерево расчета и визуализировал графики, таблицы по данным этого узла. Пока идея такая, что узел рассчитывается всякий раз при обращении к нему. Но есть подозрения, что производительность постоянного перерасчета при обращении к узлу будет деградировать и придется сохранять (или временно кэшировать) результаты расчета клиента.
  • При поступлении новых секундных данных, свертки обновляются, пользователь через некоторое время (после протухания кэша) получает свежие данные.
...
Рейтинг: 0 / 0
Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
    #39919168
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
askabout,

у меня есть опыт с хадупом и spark, потому мне было много проще на этом стеке и собрать. что-то типа такого
https://databricks.com/blog/2017/04/26/processing-data-in-apache-kafka-with-structured-streaming-in-apache-spark-2-2.html

т.е. клиенты пишут в кафку, спарк читает из кафки, пишет на hdfs в файлики parquet по сути сырые сообщения. кроме этого агригирует и записывает назад в кафку агрегацию, допустим за месяц. месячные агрегации думаю смело можно писать в mysql и показывать в вебе.

для аналитиков я бы нарисовал обычные ETL, которые из сырых parquet в стиле бигдаты строят витрины с нужным разрезом. данных не столь много, в parquet это будет занимать копейки. аналитики эти витрины джойнят с чем хотят в облаке или хадупе (hive+spark или Impala).

я бы на вашем месте нанял бы спеца на прототип. по идеи там должно быть скачать виртуалку хадупа, несколько строк в spark, на пару дней работы. т.е. должно все быть дешево и посмотреть прототип можно за копейки. ну а дальше решать, готовы ли вы погружатся в волшебный мир хадупа или проще что-то готовое в облаке взять
...
Рейтинг: 0 / 0
Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
    #39920233
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
askabout,
А чем Вас TimescaleDB не устраивает, для агрегаций можно использовать PipelineDB?
статья с хабра
Там вроде тоже бигдата и все успешно.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как выполнять расчет IoT показателей по различным иерархиям без промежуточного сохранения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]