Порядок обработки событий во Flink и рекавери

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

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

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

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

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

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


person Gajendra Naidu    schedule 26.11.2018    source источник


Ответы (1)


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

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

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

Обновлять:

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

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

person David Anderson    schedule 26.11.2018
comment
Спасибо Дэвиду за ответ. Я изменил вопрос, чтобы добавить свой вариант использования, дайте мне знать, если вам понадобится дополнительная информация. - person Gajendra Naidu; 26.11.2018