В чем разница между водяным знаком и триггером в Flink?

#stream #bigdata #real-time #apache-flink #flink-streaming

#поток #bigdata #в режиме реального времени #apache-flink #flink-потоковая передача

Вопрос:

Я прочитал, что «.. Оператор упорядочивания должен буферизировать все элементы, которые он получает. Затем, когда он получает водяной знак, он может отсортировать все элементы, у которых временная метка ниже водяного знака, и выдать их в отсортированном порядке. Это правильно, потому что водяной знак сигнализирует о том, что не может поступить больше элементов, которые были бы перемешаны с отсортированными элементами …» — https://cwiki.apache.org/confluence/display/FLINK/Time and Order in Streams

Следовательно, кажется, что водяной знак служит сигналом следующему оператору для начала обработки. Я думаю, это то, что также делает триггер. В чем разница между ними?

Ответ №1:

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

Некоторые операторы регистрируют таймеры (windows, объединения на основе времени, пользовательские реализации). Оператор запускает таймер, когда часы оператора пропускают время, для которого был зарегистрирован таймер.

Итак, водяные знаки и таймеры — это две разные вещи. Водяные знаки сообщают оператору, который час, и оператор запускает таймер в нужный момент времени.

Комментарии:

1. Итак, если я хочу, чтобы окно сеанса, основанное на времени события, было обработано, скажем, через 5 минут, нужно ли мне установить соответствующую функцию водяного знака или триггер, основанный на времени события?

2. Вам нужно только сгенерировать водяные знаки (как и для любого другого приложения времени событий) и добавить к вашему потоку данных окно сеанса времени событий с промежутком в пять минут. Вам вообще не нужно иметь дело с таймерами. Окно автоматически зарегистрирует и обработает таймеры по мере необходимости.

3. Это обработало бы окно, когда есть промежуток в пять минут. Таким образом, окно может продолжать регистрировать события, скажем, в течение 15 минут, и после перерыва в 5 минут, то есть по истечении 15 5 минут, оно будет выполнено. Верно? Я бы хотел, чтобы он не ждал 15 минут, а выполнялся через 5 первых минут, даже если продолжают поступать новые события.

4. Хорошо, это выходит за рамки данного вопроса. Окна сеанса в Flink запускаются после промежутка бездействия. Если вам нужно другое поведение, я бы рекомендовал реализовать логику с помощью ProcessFunction .

5. ОК. Просто хотел подтвердить, могу ли я добиться такого поведения с помощью какой-либо функции водяных знаков или триггера события. Есть мысли?

Ответ №2:

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

Триггеры являются частью window API и определяют, когда Windows будет выдавать результаты. EventTimeTrigger обтекает таймер времени события, который вызывается при обработке водяного знака соответствующего размера, указывая, что окно теперь завершено.