Распределить нагрузку внутри цепочки операторов в Flink - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть входной поток кинезиса с одним осколком. Я создаю простое приложение с функцией карты, но с параллелизмом уровня среды 8. Используя профилировщик потоков, когда я проверяю созданные потоки, есть только 1 поток, который активен для функции карты и источника (запрос, как упомянуто в документация). Я понимаю, что это потому, что я устанавливаю параллелизм на уровне среды. Есть ли способ распределить нагрузку между всеми параллельными экземплярами, созданными для функции карты после ее использования?

1 Ответ

1 голос
/ 17 февраля 2020

Легким решением было бы поставить rebalance() сразу после потребителя кинезиса. rebalance() делает перераспределение туда и обратно. Это перераспределит события, считываемые с одного осколка, среди 8 экземпляров карты, которая следует за ним.

Документация .

Перебалансировка вызовет ser / de и перестановка в сети. Вам придется сопоставить это с преимуществом наличия 8 активных конвейеров, а не одного.

Учитывая, что ваш график работы выглядит примерно так,

source -> map -> async -> filter -> keyBy + process function -> sink

keyBy позже в вашем конвейере вызовет еще одну случайную работу сети. Если вы очень обеспокоены производительностью, вы можете избежать использования keyBy сразу после источника (вместо использования перебалансировки там), а затем использовать reinterpretAsKeyedStream после оператора asyn c для Избегайте второго перестановки в сети. Причина, по которой это становится немного запутанной, заключается в том, что оператор asyn c ничего не знает о потоках с ключами - и это будет работать, только если один и тот же KeySelector имеет смысл как до, так и после функции asyn c.

...