这是我参与「第四届青训营 」笔记创作活动的第2天
Flink整体架构
Flink分层架构
- SDK层:SQL/TABLE,DataStream,Python
- 执行引擎层:提供统一的DAG,调度层把DAG转化成分布式环境下的Task,Task之间通过Shuffle传输数据
- 状态存储层:存储算子的状态信息
- 资源调度层:Yarn等资源调度
Flink总体架构
Flink 集群启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输
- JobManager 主要负责调度 Job 并协调 Task 做 checkpoint,以 Task 的单元调度到各个 TaskManager 去执行
- TaskManager 中每个 slot 能启动一个 Task,接受+处理数据
流批一体
为什么需要流批一体?
不是做一个离线数仓和一个实时数仓不就行吗?
缺点:
- 开发逻辑重复
- 数据计算冗余,资源浪费
- 数据口径不一致:两套系统,算子,UDF,通常会产生不同的误差,会给业务开发造成麻烦
怎么做到流批一体?
Flink本身的优势就是无界流,也就是我们说的实时;当把时间切分成一个个有边界的数据集的时候,可以把数据当做微批
Flink在流批一体上,上层API和底层的处理机制都吃统一的,所以是真正意义上的流批一体
实现:
- SQL层
- DataStream API 层
- Scheduler层
- Failover Recovery 层
- Shuffle Service层
Flink架构优化
以前总是看到文章中有OLAP,但是一直不清楚是什么东西。
OLAP(联机分析处理):基于数据仓库实现的面向分析的各类操作集合
批式计算是特殊的流式计算,而OLAP计算又是一种特殊的批式计算,所以理论上可以用Flink实现上述三种场景
因为自己做过离线和基于Flink的实时数仓,其实有一些东西是重复的。如果可以把两套系统演进为流批一体,会减少很多冗余的计算