如何在Apache Flink KeyedBroadCastProcessFunction中处理异常

时间:2020-07-10 15:09:10

标签: apache-flink flink-streaming flink-cep flink-sql

我是Flink的新手,我正在使用Flink KeyedBroadCastProcessFunction进行模式评估,与(https://flink.apache.org/2019/06/26/broadcast-state.html)相似,并且我正在使用JAVA开发我的代码,但是如果出现以下情况,我将无法处理异常处理数据流时发生任何故障,但我进行了大量搜索,但没有得到我,我最终陷入了以下两个链接

Flink: what's the best way to handle exceptions inside Flink jobs

Apache Flink - exception handling in "keyBy"

按照第一个链接,用户说他在processfn中使用sideoutput来捕获错误,我也在程序中使用sideoutput来发送与模式不匹配的数据,但是我没有得到如何处理错误和无效数据的信息数据输出到同一侧

按照第二个链接,用户正在尝试将一个接收器添加到我完全不了解的具有空键的keyby函数和printsink函数

有人可以帮我做下面的事情吗

1)用于异常处理的任何文档或小代码段我都没有在flink文档站点中找到任何东西 2)flink异常处理的最佳做法

如果有人可以回答,我没有在网上找到任何有效的资源,这对于进一步参考他人也很有帮助

1 个答案:

答案 0 :(得分:0)

您可以根据需要从ProcessFunction拥有任意多的副输出-每个副输出都有其自己唯一的OutputTag。因此,您可以将一个用于不匹配的数据,将另一个用于错误。

final OutputTag<T> unmatched = new OutputTag<String>("unmatched-data"){};
final OutputTag<String> errors = new OutputTag<String>("side-output-for-errors"){};

SingleOutputStreamOperator<T> matchedData = ...;

DataStream<T> unmatched = matchedData.getSideOutput(unmatched);
DataStream<String> errors = matchedData.getSideOutput(errors);

如果最终遇到几个不同的运算符,每个运算符都使用侧面输出来收集错误,则可以将它们合并在一起进行报告,如下所示:

final OutputTag<String> errors = new OutputTag<String>("side-output"){};

SingleOutputStreamOperator<T> task1 = ...;
SingleOutputStreamOperator<T> task2 = ...;
SingleOutputStreamOperator<T> task3 = ...;

DataStream<String> exceptions1 = task1.getSideOutput(errors);
DataStream<String> exceptions2 = task2.getSideOutput(errors);
DataStream<String> exceptions3 = task3.getSideOutput(errors);

DataStream<String> exceptions = exceptions1.union(exceptions2, exceptions3);

exceptions.addSink(new FlinkKafkaProducer(...));