这是我参与「第四届青训营 」笔记创作活动的第二天
大数据架构发展历史
graph LR
id1[史前阶段到2006] --> id2[Hadoop] --> id3[Spark] -->id4[Flink]
传统数仓 分布式 批处理 流计算
Oracle Map-reduce 流处理 实时,更快
单机 离线计算 SQL高阶API 流批一体
黑箱使用 内存迭代计算 Streaming/Batch SQL
流式计算用处
监控场景
金融监控
实时推荐
...
流式计算框架对比
Flink社区开源生态
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实现代码如下
Dag图如下
sink算子并发配置为1其余算子并发配置为2,那么SDG->PD过程如下
为了更加高效的分布式执行,Flink会尽可能的将不同的oprator Chain一块形成task
最后将task调度至TM的Slot上执行,一个slot只能运行同一个task的subtask
Flink流批一体实现
大部分的业务同时需要流与批两种系统,如果不做到流批一体将需要开发两遍,极大的浪费人力成本,同时数据链路冗余,且数据接口不一致
流/批业务场景特点:
流批一体,将有界数据集当作一种特殊的数据流,理论上可以用一套引擎架构来解决上述场景,只需要对不同的场景做相应的扩展性,并允许做出不同的优化
无边界的数据流可以通过时间片的切分成有界的数据流,所以Flink可以支持有界与无界数据流,做到流批一体
通过以下模块做到流批一体
scheduler层将DAG转换成分布式环境下可以执行的task
Flink支持以下两种调度方式
Eager模式需要足够的资源,会调度所有的任务
Lazy模式最小调度一个task,集群中只需要一个slot即可运行
Scheduler层
由pipeline的数据交换方式连接的task构成一个Pipeline Region
无论流批都按Pipeline Region粒度申请资源和调度任务
ALL_EDGES_BLOCKING
所有task之间数据交换都是按照BLOCKING模式
分为12个task
ALL_EDGES_PIPELINED
所有task之间数据交换都是按照PIPELINED模式
分为1个task
Shuffle Service层
在分布式计算中,用来连接上下游数据交互的过程叫Shuffle
分布式计算中所有遇到的上下游衔接都叫Shuffle
不同的分布式计算引擎中Shuffle的实现不同
流批之间Shuffle的差异:
在Stream和OLAP中,为了性能要求,通常使用基于Pipeline的shuffle模式
一般会选取Blocking的shuffle过程
为了统一shuffle过程,flink实现了一个Pluggable的Shuffle Service,并抽象出了一些公共模块
目前开源社区一支持
经过改造之后,Flink已经在DataStream,调度,Shuffle Service层均完成对流批的支持