文章目录
前言
从目前最新的Flink代码来看,现在它能够支持越来越多的connector类型了,不仅仅说包括于前面的Source的连接,还有后面Sink的选择。但是Flink的连接器不是简简单单的说做一个外部数据源系统的连接就OK的,而是要有一定的Exactly Once的恢复能力。因为Flink应用在做checkpoint的时候,要从前面的源到后续的Sink都得到完整的恢复。今天本文来讲述其中的基于文件系统的连接器实现,笔者主要阐述它在checkpoint模式下,如何做Exactly Once的恢复的。
FileSystem的RollingSink
在Flink的FileSystem连接器实现中,实现的一个很重要的特点是RollingSink。因为对于上游连续不断的数据传来,我们肯定不能永远让它写到一个恒定的文件或目录当中。所以这里会有一个rolling滚动的概念。那这个滚动规则如何呢?
一种简单的做法,按照小时时间级别的滚动,相当于我们人为地将1天分为了24个Bucket的概念。然后在这个目录下,我们再来按照文件大小阈值做文件的rolling。每个文件数据都是这个Bucket下内容的一部分。
当然啦,Flink也支持外部自定义Bucket的实现。
FileSystem连接器的Exactly Once恢复语义
因为Flink应用任务存在checkpoint语义恢复的情况,所以这里的文件系统连接器的文件状态在设计上不会只有一种情况了。下面我们从FileSystem Sink的文件状态讲起。