Flink1.19源码剖析【完结】
Flink是一个复杂的分布式计算框架,通过对其源代码进行分析,可以深入了解Flink的内部实现原理,包括任务调度、数据流处理、状态管理等方面。而从源代码目录入手,进行Flink源代码分析是非常必要的。因为Flink是一个开源的项目,其源代码是公开的,其组织结构非常清晰,不同模块的代码都被分别放置在不同的目录中,因此从源代码目录入手可以更加方便地找到需要分析的代码,而且可以更加系统地了解Flink的整体架构和设计思路。
一、时间类型解析
1、处理时间(Processing Time):处理时间是指数据被计算引擎处理的时间,以各个计算节点的本地时间为准。
2、事件事件(Event Time):事件时间是指数据发生的时间,通常产生于数据采集设备中,与Flink计算引擎本地时间无关。因受网络延迟、数据乱序、背压等影响,事件时间进入计算引擎往往有一定程度的数据乱序现象发生。为了计算结果的准确性,需要等待数据,但必须配合水印(Watermark)机制来触发计算动作的发生。
3、摄取时间(Ingestion Time):摄取时间是指数据流入Flink流处理系统的时间,一经读取,Flink系统就采用读取时刻作为数据的摄取时间,后续处理流程中,摄取时间保持不变。
二、水印(Watermark)解析
1、水印概念:水印本质上是一个较早的时间戳,代表数据乱序的时间错乱程度。实现上是设置一个时间间隔,用最新的事件时间或当前时间减去这个水印时间间隔得到的时间,系统就认为在这个时间之前的数据已全部收集完毕,可以触发下一步的窗口计算等动作。比如水印是10min间隔,当前时间是15:20,15:20减去10min是15:10。就代表结束时间在15:10之前的窗口可以触发窗口函数的计算了。15:10之后的数据还在水印时间间隔内,数据未收集完成,不可以触发计算。因此水印机制往往会结合窗口来实现乱序数据的处理。
2、多流Watermark获取:针对union、groupby、keyby等操作的算子会有多个上游输入边,每个输入边都有一个Watermark,算子会选取较小的Watermark水印时间戳作为当前算子的Watermark。具体选取手段如下:算子会保留3个inputWatermark1、inputWatermark2、combinedWatermark水印字段。inputWatermark1代表输入边1的当前水印,inputWatermark2代表输入边2的当前水印,combinedWatermark代表算子的当前Watermark。当输入边1输入一个最新的Watermark时,算子按公式max(min(新inputWatermark1,inputWatermark2),combinedWatermark)得到算子新结果Watermark,如果新结果Watermark大于combinedWatermark时,则更新combinedWatermark并下发新结果Watermark。当输入边2输入一个最新的Watermark时,处理规则类似。
三、窗口解析
在批处理场景下,数据已经按天、周、月等某个时间间隔分批次存储及处理了。但在流处理场景下数据源源不断地流入,没有始末。因此在流数据处理中经常需要明确一个时间窗口,在该时间窗口维度下进行数据聚合处理等操作。在Flink系统实现中有三种窗口分类:计数窗口、时间窗口、会话窗口。其中计数窗口可以细分为滚动计数窗口、滑动计数窗口,时间窗口可以细分为滚动时间窗口、滑动时间窗口。![QQ截图20240905102342.png](http://static.itsharecircle.com/240905/2dc907fbe3af0373a3e9cddad1ddfbc0.png)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传