一、Flink源码分析——用户状态数据的源码实现(/s/1MyhObdLRlRD-aoWfRx8J5g 提取码:iamk )
状态数据是flink中非常重要的一部分,在flink实时计算中,涉及到聚合操作的计算,不管是窗口计算还是非窗口计算,都离不开状态数据,在窗口计算中,状态数据由flink自己进行维护,用户不需关心。但是还有一些算子,用户可以自己操作状态数据,比如在map算子中定义状态数据,可能是ValueState或者ListState。本文就来分析一下这些状态数据到底是如何实现和管理的。
首先,flink的状态数据分为两种,一种是KeyedState,这是针对kv键值对的状态数据,每个key都有自己的状态值,一般用在keyBy算子之后。另一种是OperatorState,跟key无关,每个operator的实例只有一个state。
二、Flink源码解析——时间、水印及窗口原理解析
1、时间类型解析
1-1、处理时间(Processing Time):处理时间是指数据被计算引擎处理的时间,以各个计算节点的本地时间为准。
1-2、事件事件(Event Time):事件时间是指数据发生的时间,通常产生于数据采集设备中,与Flink计算引擎本地时间无关。因受网络延迟、数据乱序、背压等影响,事件时间进入计算引擎往往有一定程度的数据乱序现象发生。为了计算结果的准确性,需要等待数据,但必须配合水印(Watermark)机制来触发计算动作的发生。
1-3、摄取时间(Ingestion Time):摄取时间是指数据流入Flink流处理系统的时间,一经读取,Flink系统就采用读取时刻作为数据的摄取时间,后续处理流程中,摄取时间保持不变。
2、水印(Watermark)解析
水印概念:水印本质上是一个较早的时间戳,代表数据乱序的时间错乱程度。实现上是设置一个时间间隔,用最新的事件时间或当前时间减去这个水印时间间隔得到的时间,系统就认为在这个时间之前的数据已全部收集完毕,可以触发下一步的窗口计算等动作。比如水印是10min间隔,当前时间是15:20,15:20减去10min是15:10。就代表结束时间在15:10之前的窗口可以触发窗口函数的计算了。15:10之后的数据还在水印时间间隔内,数据未收集完成,不可以触发计算。因此水印机制往往会结合窗口来实现乱序数据的处理。
三、Flink源码编译启动
背景
纯小白新手入门flink,由于自身基础差底子薄,启动个源码各种查资料找资源,终于启动好了 值得记录一下,本文源码启动是基于idea+jdk8+maven在windows上启动flink1.16源码。
(1)下载源码
(2)项目编译
首先在idea中打开命令终端Terminal,然后进行编译
在flink目录中执行:
mvn clean install -DskipTests -Dmaven.javadoc.skip=false -T 1C
进入flink-dist目录(cd flink-dist)执行:
mvn install -DskipTests
这个过程较慢,需要耐心等一会。。。
如果在此过程中报错:Too many files with unapproved license, 需要加入-Drat.skip=true 跳过许可证发行检查。
四、Flink调度器
调度器 是 Flink 作业执行的核心组件,管理作业执行的所有相关过程,包括 JobGraph 到 ExecutionGraph 的转换、作业生命周期管理(作业的发布、取消、停止)、作业的 Task 生命周期管理(Task 的发布、取消、停止)、资源申请与释放、作业和 Task 的 Faillover 等。
ScheduleNG实际负责job调度处理,包括生成ExecutionGraph,作业的调度执行,任务出错处理等。其实现类为DefaultScheduler。
DefaultScheduler:Flink 目前默认的调度器,是 Flink 新的调度设计,使用 SchedulerStrategy 来实现调度。
LegacySchedular:过去的调度器,实现了原来的 Execution 调度逻辑。(已经弃用)
SchedulingStrategy:任务调度的策略,实现类为PipelinedRegionSchedulingStrategy,按pipeline region的粒度来调度任务
五、Flink Job的提交流程的源码
从源码层面谈Flink Job的提交流程
我们提交的Flink Job会被转化成一个DAG任务运行,分别是:StreamGraph、JobGraph、ExecutionGraph,Flink中JobManager与TaskManager,JobManager与Client的交互是基于Akka工具包的,是通过消息驱动。整个Flink Job的提交还包含着ActorSystem通信系统的创建,JobManager的启动,TaskManager的启动和注册等过程。
Flink所谓"三层图"结构是哪几个"图"?
一个Flink任务的DAG生成计算图大致经历以下三个过程:
① StreamGraph 最接近代码所表达的逻辑层面的计算拓扑结构,按照用户代码的执行顺序向StreamExecutionEnvironment添加StreamTransformation构成流式图;
② JobGraph 从StreamGraph生成,将可以串联合并的节点进行合并,设置节点之间的边,安排资源共享slot槽位和放置相关联的节点,上传任务所需的文件,设置检查点配置等。相当于经过部分初始化和优化处理的任务图;
③ ExecutionGraph 由JobGraph转换而来,包含了任务具体执行所需的内容,是最贴近底层实现的执行图
六、Flink源码解析——StreamGraph生成过程解析
1、StreamNode:StreamNode是StreamGraph中的节点,由Transformation转换而来,可以理解成一个StreamNode就表示一个算子计算过程。Transformation分虚拟Transformation和物理Transformation,相应转换成的StreamNode也分为虚拟StreamNode和物理StreamNode。物理StreamNode最终会变成物理的算子,虚拟StreamNode会附着在StreamEdge上。StreamNode可以有多个输入,也可以有多个输出。
2、StreamEdge:StreamEdge是StreamGraph中的边,用来连接2个StreamNode。一个StreamNode可以有多个出边、多个入边。在StreamEdge中包含着OutputTag、StreamPartitioner等必要的边生成信息。
3、StreamGraph主要由StreamNode、StreamEdge组成,下图中StreamGraph几个主要成员变量负责组织StreamNode、StreamEdge的存储。
有疑问加站长微信联系(非本文作者)