楼主: kaixin202212
288 1

[作业] Flink1.19源码剖析课程|Flink源码教程 [推广有奖]

  • 0关注
  • 1粉丝

讲师

97%

还不是VIP/贵宾

-

威望
0
论坛币
581 个
通用积分
37.4960
学术水平
0 点
热心指数
3 点
信用等级
0 点
经验
9378 点
帖子
313
精华
0
在线时间
397 小时
注册时间
2022-11-10
最后登录
2024-11-15

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
一、Flink源码分析——用户状态数据的源码实现
状态数据是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的存储。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:link Lin environment Scheduling Processing

沙发
kaixin202212 发表于 2024-10-18 14:47:14 |只看作者 |坛友微信交流群
学习地址:https://pan.baidu.com/s/1MyhObdLRlRD-aoWfRx8J5g 提取码:iamk

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-21 18:28