Apache flink 弗林克:什么;这是处理Flink作业内部异常的最佳方法

Apache flink 弗林克:什么;这是处理Flink作业内部异常的最佳方法,apache-flink,Apache Flink,我有一份flink的工作,涉及Kafaka主题,并经历了一系列操作员。我想知道处理中间发生的异常的最好方法是什么?< /P> 我的目标是有一个集中的位置来处理可能从不同操作员引发的异常,下面是我当前的解决方案: 假设存在异常,则在catch块中使用ProcessFunction并将sideOutput输出到context,并在调用外部服务以更新另一个相关作业状态的末尾为sideOutput使用单独的sink函数 但是,我的问题是,通过这样做,我似乎仍然需要调用collector.collect(

我有一份flink的工作,涉及Kafaka主题,并经历了一系列操作员。我想知道处理中间发生的异常的最好方法是什么?< /P> 我的目标是有一个集中的位置来处理可能从不同操作员引发的异常,下面是我当前的解决方案:

假设存在异常,则在catch块中使用
ProcessFunction
并将
sideOutput
输出到
context
,并在调用外部服务以更新另一个相关作业状态的末尾为
sideOutput
使用单独的sink函数

但是,我的问题是,通过这样做,我似乎仍然需要调用
collector.collect()
并传入一个空值,以便继续执行以下运算符并进入最后一个阶段,
sideOutput
将流入单独的sink函数。这样做对吗


此外,我也不确定如果我不在操作符内部调用收集器.collect(),实际会发生什么情况,它会挂在那里并导致内存泄漏吗?

不调用收集器.collect()。当您使用side输出捕获异常时,不需要使用空值调用
collect()
,每个操作符都可以有自己的side输出。最后,如果您有多个这样的操作符,并且有一个用于异常的side输出,那么您可以在将该流发送到接收器之前将side输出一起


如果出于某种原因,下游操作员需要知道存在异常,那么一种方法是输出
,但是每个下游操作员当然需要有代码来检查其接收的内容。

不调用
收集器.collect()
。当您使用side输出捕获异常时,不需要使用空值调用
collect()
,每个操作符都可以有自己的side输出。最后,如果您有多个这样的操作符,并且有一个用于异常的side输出,那么您可以在将该流发送到接收器之前将side输出一起


如果出于某种原因,下游运营商需要知道存在异常,那么一种方法是输出
,但是每个下游运营商当然需要代码来检查其接收的内容。

谢谢!我也很好奇,当在操作符中没有调用
collector.collect()
时,确切的行为是什么?如果有一个操作符生成了side输出,那么其余的操作符将无法正确执行,前提是最后我没有
collect()
。然后,我需要在每个操作符之后添加sink函数,以捕获潜在的副输出。如果您从未在操作符内部调用
collect()
,则没有数据通过流流向下一个操作符,因此是的……在这种情况下,不会调用下游操作符,因为它们没有任何数据可处理。谢谢!我也很好奇,当在操作符中没有调用
collector.collect()
时,确切的行为是什么?如果有一个操作符生成了side输出,那么其余的操作符将无法正确执行,前提是最后我没有
collect()
。然后,我需要在每个操作符之后添加sink函数,以捕获潜在的副输出。如果您从未在操作符内部调用
collect()
,则没有数据通过流流向下一个操作符,因此是的……在这种情况下,不会调用下游操作符,因为它们没有任何数据要处理。