Error handling ApacheFlink错误处理和条件处理
我是Flink的新手,已经浏览过网站/示例/博客开始学习。我正在努力正确使用操作符。基本上我有两个问题 问题1:Flink是否支持声明性异常处理,我需要处理parse/validate/。。。错误?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函数中获取
- 我可以使用org.apache.flink.runtime.operators.sort.ExceptionHandler或类似的工具吗 处理错误
- 还是Rich/FlatMap功能是我的最佳选择? 如果Rich/FlatMap是唯一的选项,那么有没有一种方法可以在Rich/FlatMap函数中获取流的句柄,以便连接接收器进行错误处理
- 基于键控分割流中的某些字段,我需要选择不同的接收器,我是再次分割流还是使用Rich/FlatMap来处理
.....
.....
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建议,我发现“侧输出”更灵活,但它需要预先设置键控流