Многопоточность/параллельное выполнение Apache flink

Входной поток состоит из данных в формате массива объектов JSON. Каждый объект имеет одно поле/ключ с именем state, по которому нам нужно разделить входной поток, см. пример ниже.

Объект1 -> «Состояние»: «Активный»

Объект2 -> «Состояние»: «Простой»

Объект3 -> «Состояние»: «Заблокировано»

Объект4 -> «Состояние»: «Активный»

Мы должны начать обработку/поток, как только мы получим определенное состояние, продолжать получать данные, если новое состояние похоже на предыдущее состояние, пусть предыдущий поток обработает его, иначе запустите новый поток для нового состояния. Также требуется, чтобы каждый поток выполнялся в течение конечного времени, и все потоки должны выполняться параллельно.

Пожалуйста, предложите, как я могу сделать это в Apache Flink. Псевдокоды и ссылки были бы полезны.


person Kspace    schedule 08.03.2018    source источник
comment
Отличается ли ваша логика обработки в зависимости от состояния? И ограничено ли значение «Состояние» только одним из упомянутых 4 или динамически может быть несколько состояний?   -  person shriyog    schedule 08.03.2018
comment
@narush Логика обработки такая же, и на данный момент состояния конечны, но в будущем их число может увеличиться.   -  person Kspace    schedule 08.03.2018


Ответы (2)


Это можно сделать с помощью API потока данных Flink. Каждый объект JSON можно рассматривать как кортеж, который можно обрабатывать с помощью любого из Операторы Flink.

               /----- * *  | Active
------ (KeyBy) ------ *    | Idle
               \----- *    | Blocked

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

Любые новые ключи (состояния) динамически обрабатываются по мере создания для них новых потоков ключей.

Изучите документацию с целью реализации.

person shriyog    schedule 08.03.2018
comment
Спасибо за ответ, Наруш. Не могли бы вы рассказать мне, как мы можем продолжать получать ввод и выполнять каждый поток/ключ в течение конечного времени, например 10 минут. Я новичок в флинке и просто знаю его основы. - person Kspace; 08.03.2018
comment
В любом случае вы будете продолжать вводить данные в этот конкретный ключевой поток, пока у вас не появятся объекты JSON. Если вы хотите выполнить некоторые операции через определенное время, на сцену выходит оконное управление Flink. Пожалуйста, узнайте больше, прочитав хорошо поддерживаемый документация. - person shriyog; 08.03.2018

Из вашего описания я полагаю, что вам сначала понадобится оператор с параллелизмом 1, который «разбивает» события по состоянию и добавляет «идентификатор фрагмента» в выходную запись. Всякий раз, когда вы получаете событие с новым состоянием, вы увеличиваете идентификатор фрагмента.

Затем введите идентификатор фрагмента, который будет распараллеливать нисходящую обработку. Добавьте пользовательскую функцию, которая определяется идентификатором фрагмента и имеет продолжительность окна 10 минут. Здесь будет происходить основная часть обработки ваших данных.

И, как отметил выше @narush, вам следует прочитать документацию, на которую он ссылается, чтобы понять, как работают окна во Flink.

person kkrugler    schedule 08.03.2018