流/批/OLAP 一体的 Flink 引擎介绍|青训营笔记

114 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第二天

大数据架构发展历史

graph LR
id1[史前阶段到2006] --> id2[Hadoop] --> id3[Spark] -->id4[Flink]
传统数仓                    分布式              批处理           流计算
Oracle                      Map-reduce         流处理           实时,更快
单机                        离线计算            SQL高阶API       流批一体
黑箱使用                                        内存迭代计算     Streaming/Batch SQL

流式计算用处

监控场景
金融监控
实时推荐
...

image.png 流式计算框架对比

image.png

Flink社区开源生态

image.png

Flink整体架构

FLink分层架构

分为四个层次:
SDK层:SDK目前总共三类(SQL/Table DataStream Python)
执行引擎层:提供了统一的DAG图,用来描述数据处理的Pipeline,不管是流还是批,都会转换成DAG,调度层再将DAG转换为Task,Task之间通过Shuffle传输数据
状态存储层:负责存储算子的状态信息
资源调度层:Flink支持部署再多种环境下

Flink核心组件

JobManager:负责整个业务的协调工作,包括调度Task,触发协调的Task做CheckPoint,协调容错恢复等
TaskManager:负责执行一个DataFlowGraph的各个task以及data streams的buffer和数据交换

JobManager职责

Dispatcher:接收作业,拉起JobManager来执行作业,并再JobManager挂掉后恢复作业
JobMaster:管理一个Job的整个生命周期,会向ResoureManager申请一个slot,并将task分配至TM上
ResoureManager:负责slot资源的管理调度,TM拉起后会向RM注册

Flink作业示例

流式WordcCount示例,从kafka读取一个实时数据流每十秒统计一次单词出现的个数,DataStream实现代码如下

image.png

Dag图如下

image.png

sink算子并发配置为1其余算子并发配置为2,那么SDG->PD过程如下

image.png

为了更加高效的分布式执行,Flink会尽可能的将不同的oprator Chain一块形成task

    

image.png

最后将task调度至TM的Slot上执行,一个slot只能运行同一个task的subtask

image.png Flink流批一体实现

大部分的业务同时需要流与批两种系统,如果不做到流批一体将需要开发两遍,极大的浪费人力成本,同时数据链路冗余,且数据接口不一致
流/批业务场景特点:
    

image.png

image.png

流批一体,将有界数据集当作一种特殊的数据流,理论上可以用一套引擎架构来解决上述场景,只需要对不同的场景做相应的扩展性,并允许做出不同的优化

无边界的数据流可以通过时间片的切分成有界的数据流,所以Flink可以支持有界与无界数据流,做到流批一体
通过以下模块做到流批一体

image.png

scheduler层将DAG转换成分布式环境下可以执行的task
Flink支持以下两种调度方式

image.png

Eager模式需要足够的资源,会调度所有的任务


image.png

Lazy模式最小调度一个task,集群中只需要一个slot即可运行

image.png

Scheduler层
由pipeline的数据交换方式连接的task构成一个Pipeline Region
无论流批都按Pipeline Region粒度申请资源和调度任务

image.png

ALL_EDGES_BLOCKING
    所有task之间数据交换都是按照BLOCKING模式
    分为12个task
ALL_EDGES_PIPELINED
    所有task之间数据交换都是按照PIPELINED模式
    分为1个task

image.png

Shuffle Service层
在分布式计算中,用来连接上下游数据交互的过程叫Shuffle
分布式计算中所有遇到的上下游衔接都叫Shuffle
不同的分布式计算引擎中Shuffle的实现不同

image.png

流批之间Shuffle的差异:
    

image.png

image.png

Stream和OLAP中,为了性能要求,通常使用基于Pipeline的shuffle模式
一般会选取Blocking的shuffle过程
为了统一shuffle过程,flink实现了一个Pluggable的Shuffle Service,并抽象出了一些公共模块
目前开源社区一支持

image.png

经过改造之后,Flink已经在DataStream,调度,Shuffle Service层均完成对流批的支持

image.png