Apache Луч: увеличить поток с метрикой c на основе скользящего окна последних X минут - PullRequest
0 голосов
/ 23 февраля 2020

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

Моя проблема: у меня есть поток данных, поступающий из Датчики IoT через Google Pub / Sub. Данные состоят из идентификатора устройства, местоположения (координаты GPS) и метки времени. Я хотел бы дополнить эти данные показателями на основе скользящего окна за последние X минут, рассчитанного для каждого устройства.

Например: предположим, что каждое устройство IoT отправляет данные каждые 5 секунд. Я хотел бы иметь новый Pub / Sub topi c, в котором мои исходные данные будут дополнены новым полем, для которого будет вычислен показатель c, рассчитанный на основе всех событий, отправленных этим устройством за последние 5 минут. Моя конечная цель - определить расстояние, которое каждое устройство прошло за последние 5 минут, но для простоты примера давайте начнем с подсчета того, сколько событий было замечено на этом устройстве за последние 5 минут.

Пример исходного потока, из которого я получаю свои данные:

Time 0: { deviceId: 'A', coordinates: [X, Y], timestamp: 11110 }
Time 1: { deviceId: 'A', coordinates: [X, Y], timestamp: 11115 }
Time 2: { deviceId: 'A', coordinates: [X, Y], timestamp: 11120 }
Time 3: { deviceId: 'B', coordinates: [X, Y], timestamp: 11122 }

Мне бы хотелось, чтобы мой выходной поток был:

Time 0: { deviceId: 'A', coordinates: [X, Y], timestamp: 11110, eventsLast5Min: 0 }
Time 1: { deviceId: 'A', coordinates: [X, Y], timestamp: 11115, eventsLast5Min: 1 }
Time 2: { deviceId: 'A', coordinates: [X, Y], timestamp: 11120, eventsLast5Min: 2 }
Time 3: { deviceId: 'B', coordinates: [X, Y], timestamp: 11122, eventsLast5Min: 0 }

Обратите внимание, что я не хочу вывод Поток «ждать» 5 минут, прежде чем проходить через события. Я хотел бы, чтобы выходной поток был как можно ближе по времени к входному потоку, но просто добавив метри c на основе агрегированных данных, полученных за последние 5 минут (скользящее окно).

(есть Apache Передайте подходящий инструмент для решения этой проблемы? Если нет, то что еще я мог бы использовать?)

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

У кого-нибудь есть примеры / идеи или псевдокод о том, как этого добиться?

Обновление: это хороший вариант использования функции боковых входов? https://beam.apache.org/documentation/programming-guide/#side -inputs . Я думал, если у меня будет 2 "ветви" моего трубопровода. Одна ветвь просто проходит через мой ввод, а другая использует скользящее окно для вычисления метри c, который я хочу, и в конце они оба каким-то образом объединяются.

| (input stream)
|\
| \
|  \
|   \
|   | (window and calculate metric)
|  /
| /
|/
|
| (output stream)

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

Спасибо

...