我有一个flink的工作,接受卡法卡的主题,经历了一堆操作员。我想知道处理中间发生的例外的最好方法是什么。
我的目标是有一个集中的地方来处理那些可能从不同操作符抛出的异常,下面是我当前的解决方案:
使用 ProcessFunction
和输出 sideOutput
至 context
在catch块中,假设存在异常,并为 sideOutput
在调用外部服务以更新另一个相关作业的状态的末尾
然而,我的问题是,这样做似乎我仍然需要打电话 collector.collect()
并传入一个空值,以便继续执行以下运算符并到达最后一个阶段,其中 sideOutput
将流入单独的Flume功能。这样做对吗?
我也不知道如果我不打电话到底会发生什么 collector.collect()
在操作符内部,它会挂在那里导致内存泄漏吗?
1条答案
按热度按时间xytpbqjk1#
不打电话没关系
collector.collect()
. 你不需要打电话collect()
在使用side输出捕获异常时使用空值-每个操作符都可以有自己的side输出。最后,如果您有多个这样的操作符,并且有一个用于异常的边输出,那么您可以union()
在将流发送到接收器之前,边一起输出。如果出于某种原因,下游操作员需要知道存在异常,那么一种方法是输出
Either<good result, Exception>
,但是每个下游操作员当然需要有代码来检查它接收到的内容。