flink进阶富函数生命周期介绍
DaveCui 人气:0end-to-end exactly-once
exactly-once只能保证Flink内部状态的一致性。而这个语义主要依赖Checkpoint机制。
在外部交互的一致性则无法保证,端到端的Exactly-Once问题是分布式系统领域最具挑战性的问题之一,很多框架都在试图攻克这个难题。
Flink的exactly-once主要依赖Source和Sink提供的一些功能。Source需要支持重发功能,Sink需要采用一定的数据写入技术,比如幂等写或事务写。
对于Source重发功能,只要我们记录了输入的偏移量Offset,故障重启后数据发送方从该Offset重新开始发送数据即可。Kafka的Producer除了发送数据,还会将数据持久化写到日志文件中。如果下游应用重启,Producer根据下游提供的Offset,从持久化的文件中定位到数据,可以重新开始向下游发送数据。
Source的重发会导致一条数据被处理多次,为了保证只对下游系统产生一次影响,还需要依赖Sink的幂等写或事务写。
富函数
“富函数”是DataStream API提供的一个函数类的接口,所有Flink函数类都有其Rich版本。它与常规函数的不同在于,可以获取运行环境的上下文,并拥有一些生命周期方法,所以可以实现更复杂的功能。
富函数举例
**RichMapFunction **
**RichFlatMapFunction **
**RichFilterFunction **
Rich Function有一个生命周期的概念。典型的生命周期方法有:
- open()方法是rich function的初始化方法,当一个算子例如map或者filter被调用之前open()会被调用。
这里可以做一些初始化工作,例如建立一个和数据源的连接
- **close()方法是生命周期中的最后一个调用的方法,做一些清理工作。 **
这里做一些清理工作,例如断开和数据源的连接。
- getRuntimeContext()方法提供了函数的RuntimeContext的一些信息,例如函数执行的并行度,任务的名字,以及state状态
其他的和FlatMapFunction算子的重写方法类似。
加载全部内容