Порядок обработки событий во Флинке и восстановления - PullRequest
0 голосов
/ 26 ноября 2018

Я исследую Флинк больше недели.Мы потребляем события от Kafka и хотим, чтобы события принадлежали конкретному объекту, идентификатор которого необходимо обработать в порядке времени события.Пока мое исследование говорит мне, что я должен использовать keyby и timeWindows, мое понимание верно?

Другой вопрос. Когда один менеджер задач выходит из строя, только те события, которые будут принадлежать этому диспетчеру задач, будут остановлены, пока не появится диспетчер задач?Знает ли механизм контрольных точек события, которые не обрабатываются, как он будет запрашивать у Kafka эти события?

Вопрос с вариантом использования ниже

В CallCenter агентбудет принимать звонки и перейдет в разные состояния.Для каждого действия агента, например входа в систему, ожидания, занятости и т. Д., Мы получаем событие агента этого действия как состояние через Kafka.Требование состоит в том, что мы должны обрабатывать события в порядке по агенту, мы не можем обрабатывать событие ожидания агента до события входа в систему.Нам нужно обработать их для того, чтобы одновременно масштабировать.

В кластере Flink с параллельным процессом мы не должны в конечном итоге обрабатывать информацию об агенте в разных разделах / задачах с плохим состоянием агента.Мой вопрос заключается в том, что keyBy agentId будет делить поток на подпотоки и все время обрабатывать их в указанном разделе, таким образом сохраняется порядок обработки событий.

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

1 Ответ

0 голосов
/ 26 ноября 2018

Вы захотите использовать keyBy (objectId) для разделения потока по идентификатору объекта.

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

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

Обновление:

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

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

...