Error handling ApacheFlink错误处理和条件处理

Error handling ApacheFlink错误处理和条件处理,error-handling,conditional,apache-flink,event-stream-processing,Error Handling,Conditional,Apache Flink,Event Stream Processing,我是Flink的新手,已经浏览过网站/示例/博客开始学习。我正在努力正确使用操作符。基本上我有两个问题 问题1:Flink是否支持声明性异常处理,我需要处理parse/validate/。。。错误? 我可以使用org.apache.flink.runtime.operators.sort.ExceptionHandler或类似的工具吗 处理错误 还是Rich/FlatMap功能是我的最佳选择? 如果Rich/FlatMap是唯一的选项,那么有没有一种方法可以在Rich/FlatMap函数中获取

我是Flink的新手,已经浏览过网站/示例/博客开始学习。我正在努力正确使用操作符。基本上我有两个问题

问题1:Flink是否支持声明性异常处理,我需要处理parse/validate/。。。错误?

  • 我可以使用org.apache.flink.runtime.operators.sort.ExceptionHandler或类似的工具吗 处理错误
  • 还是Rich/FlatMap功能是我的最佳选择? 如果Rich/FlatMap是唯一的选项,那么有没有一种方法可以在Rich/FlatMap函数中获取流的句柄,以便连接接收器进行错误处理
问题2:我可以有条件地连接不同的接收器吗?

  • 基于键控分割流中的某些字段,我需要选择不同的接收器,我是再次分割流还是使用Rich/FlatMap来处理
我使用的是Flink 1.3.2。这是我工作的相关部分

    .....
    .....
    DataStream<String> eventTextStream = env.addSource(messageSource)

    KeyedStream<EventPojo, Tuple> eventPojoStream = eventTextStream
            // parse, transform or enrich
            .flatMap(new MyParseTransformEnrichFunction())
            .assignTimestampsAndWatermarks(new EventAscendingTimestampExtractor())
            .keyBy("eventId");

    // split stream based on eventType as different reduce and windowing functions need to be applied
    SplitStream<EventPojo> splitStream = eventPojoStream
            .split(new EventStreamSplitFunction());

    // need to apply reduce function
    DataStream<EventPojo> event1TypeStream = splitStream.select("event1Type");

    // need to apply reduce function
    DataStream<EventPojo> event2TypeStream = splitStream.select("event2Type");

    // need to apply time based windowing function
    DataStream<EventPojo> event3TypeStream = splitStream.select("event3Type");

    ....
    ....

    env.execute("Event Processing");      
。。。。。
.....
DataStream eventTextStream=env.addSource(messageSource)
KeyedStream eventPojoStream=eventTextStream
//解析、转换或充实
.flatMap(新的MyParseTransformEnricFunction())
.AssignTimeStampAndWatermarks(新的EventAscendingTimestampExtractor())
.keyBy(“eventId”);
//基于eventType分割流,因为需要应用不同的reduce和windowing函数
SplitStream SplitStream=eventPojoStream
.split(新的EventStreamSplitFunction());
//需要应用reduce函数吗
DataStream event1TypeStream=splitStream.select(“event1Type”);
//需要应用reduce函数吗
DataStream event2TypeStream=splitStream.select(“event2Type”);
//需要应用基于时间的窗口功能
DataStream event3TypeStream=splitStream.select(“event3Type”);
....
....
环境执行(“事件处理”);
我在这里使用正确的运算符吗

更新1:

尝试使用@alpinegizmo建议的ProcessFunction,但这不起作用,因为它依赖于一个键控流,我在解析/验证输入之前没有该键控流。我得到“InvalidProgrameException:对于非复合类型,字段表达式必须等于'*'或'.'.”

这是一个常见的用例,您的第一次解析/验证输入,但还没有键控流,所以如何解决它


感谢您的耐心和帮助。

您忽略了一个关键构建块。看一看


这种机制提供了一种类型安全的方法来生成任意数量的额外输出流。除其他用途外,这是一种报告错误的干净方法。在Flink 1.3中,侧输出只能与ProcessFunction一起使用,但1.4将使用。

谢谢,ProcessFunction肯定比FlatMap更灵活,但是它需要KeyedStream,我在第一次使用FlatMap之前无法访问它。在这里,我解析xml字符串并转换为Pojo,然后在其中一个字段上键入。我想我可以将键“模拟”为整个xml字符串,以满足ProcessFunction的需要。这样可以吗?当我得到“InvalidProgrameException:字段表达式对于非复合类型必须等于“*”或“u”时,我似乎无法“模拟”键。我认为
org.apache.flink.runtime.operators.sort.ExceptionHandler
是用于BatchTask的。对于流,我见过任何处理全局异常的处理程序。您只需在键控流操作符之后添加拆分操作符,结果将发送到不同的接收器。谢谢David,是的,拆分流可以处理问题2,但不能处理问题1,但是基于@alpinegimo建议,我发现“侧输出”更灵活,但它需要预先设置键控流