首页 > 解决方案 > Flink:在 Flink 作业中处理异常的最佳方法是什么

问题描述

我有一个 flink 工作,它接受 Kafaka 主题并通过一堆运算符。我想知道处理中间发生的异常的最佳方法是什么。

我的目标是有一个集中的地方来处理可能从不同运营商抛出的那些异常,这是我目前的解决方案:

在 catch 块中使用ProcessFunction和输出sideOutputcontext,假设有一个异常,并且sideOutput在它调用外部服务以更新另一个相关作业的状态的末尾有一个单独的接收器函数

但是,我的问题是,通过这样做,我似乎仍然需要调用collector.collect()并传入一个空值,以便继续执行后续运算符并到达sideOutput将流入单独接收器函数的最后阶段。这是正确的方法吗?

另外我不确定如果我不在collector.collect()操作员内部调用实际会发生什么,它会挂在那里并导致内存泄漏吗?

标签: apache-flink

解决方案


不打电话就好了collector.collect()。当您使用侧输出捕获异常时,您不需要collect()使用空值调用 - 每个运算符都可以有自己的侧输出。最后,如果您有多个这样的操作符带有异常的侧面输出,您可以union()在将该流发送到接收器之前将侧面输出放在一起。

如果出于某种原因下游操作员需要知道存在异常,那么一种方法是输出一个Either<good result, Exception>,但是每个下游操作员当然需要有代码来检查它正在接收什么。


推荐阅读