Flink: как лучше обрабатывать исключения в заданиях Flink - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть работа по быстрому изучению кафака, которая проходит через несколько операторов.Мне интересно, как лучше всего справляться с исключениями, которые происходят в середине.

Моя цель - создать централизованное место для обработки тех исключений, которые могут генерироваться различными операторами, и вот мое текущее решение:

Используйте ProcessFunction и выведите от sideOutput до context в блоке перехвата, при условии, что есть исключение, и используйте отдельную функцию приемника для sideOutput в конце, где он вызывает внешнюю службучтобы обновить статус другого связанного задания

Однако, мой вопрос заключается в том, что при этом мне все равно нужно вызвать collector.collect() и передать нулевое значение, чтобы перейти к следующим операторам и перейти на последний этап.где sideOutput перейдет в отдельную функцию приемника.Это правильный способ сделать это?

Кроме того, я не уверен, что на самом деле произойдет, если я не вызову collector.collect() внутри оператора, будет ли он зависать там и вызывать утечку памяти?

1 Ответ

0 голосов
/ 20 сентября 2018

Это нормально, чтобы не звонить collector.collect().И вам не нужно вызывать collect() с нулевым значением, когда вы используете побочный вывод для захвата исключения - у каждого оператора может быть свой побочный вывод.Наконец, если у вас есть несколько таких операторов с побочным выводом для исключений, вы можете union() побочные выводы вместе перед отправкой этого потока в приемник.

Если по какой-либо причине нисходящим операторам необходимоЕсли вы знаете, что произошла исключительная ситуация, тогда один из подходов - вывести Either<good result, Exception>, но тогда каждому оператору, работающему в нисходящем направлении, необходим код для проверки того, что он получает.

...