Применение оконных правил в потоке Apache Flink Broadcast - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть набор правил в моем BroadcastStream в Apache Flink. Я могу применять новые правила по мере их поступления в мой поток событий. Но я не могу понять, как я могу реализовать, если мои правила вроде

rule 1> alert when count of event a is greater than 5 in a window of 5 mins
rule 2> alert when count of event a is greater than 4 in a window of 15 mins

Я новичок, чтобы моргнуть. Я не могу понять это.

1 Ответ

0 голосов
/ 11 ноября 2019

Приложение, основанное на flink-sql или flink-cep, не сможет этого сделать, поскольку эти библиотеки могут обрабатывать только те правила, которые определены во время компиляции задания. Вам нужно будет начать новую работу для каждого нового правила, которое может не соответствовать вашим требованиям.

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

Вот эскиз возможной реализации:

Вы можете использовать состояние ключа вKeyedBroadcastProcessFunction для отслеживания текущего количества в каждом окне. Если правила могут характеризоваться временным интервалом и порогом подсчета, вы можете использовать MapState, где ключи - это идентификаторы правил, а значения на карте - текущий счетчик для этого правила. У вас может быть таймер для каждого правила, которое срабатывает при завершении каждого окна.

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

Некоторые потенциальные сложности, о которых следует помнить:

  1. Эта реализация требует, чтобы вы разбили ваш поток на keyBy, чтобы вы могли использовать MapState и таймеры.
  2. Широковещательный поток не может иметь связанные с ним таймеры, поэтому необходимо управлять таймерами. с помощью метода processElement, который обрабатывает поток с ключами.
  3. Flink допускает только один таймер для данного ключа и данной временной метки. Поэтому будьте осторожны, если вам необходимо обработать случай, когда два правила должны быть запущены одновременно.
  4. Если события могут поступать не по порядку, то вам необходимо либо сначала отсортировать поток по отметке времени, либоразрешить одновременное открытие нескольких окон.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...