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

95 阅读2分钟

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

Flink整体架构

Flink分层架构

  1. SDK层:SQL/TABLE,DataStream,Python
  2. 执行引擎层:提供统一的DAG,调度层把DAG转化成分布式环境下的Task,Task之间通过Shuffle传输数据
  3. 状态存储层:存储算子的状态信息
  4. 资源调度层:Yarn等资源调度

Flink总体架构

Flink 集群启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输

  • JobManager 主要负责调度 Job 并协调 Task 做 checkpoint,以 Task 的单元调度到各个 TaskManager 去执行
  • TaskManager 中每个 slot 能启动一个 Task,接受+处理数据

流批一体

为什么需要流批一体?

不是做一个离线数仓和一个实时数仓不就行吗?

缺点:

  1. 开发逻辑重复
  2. 数据计算冗余,资源浪费
  3. 数据口径不一致:两套系统,算子,UDF,通常会产生不同的误差,会给业务开发造成麻烦

怎么做到流批一体?

Flink本身的优势就是无界流,也就是我们说的实时;当把时间切分成一个个有边界的数据集的时候,可以把数据当做微批

Flink在流批一体上,上层API和底层的处理机制都吃统一的,所以是真正意义上的流批一体

实现:

  1. SQL层
  2. DataStream API 层
  3. Scheduler层
  4. Failover Recovery 层
  5. Shuffle Service层

Flink架构优化

以前总是看到文章中有OLAP,但是一直不清楚是什么东西。

OLAP(联机分析处理):基于数据仓库实现的面向分析的各类操作集合

批式计算是特殊的流式计算,而OLAP计算又是一种特殊的批式计算,所以理论上可以用Flink实现上述三种场景

因为自己做过离线和基于Flink的实时数仓,其实有一些东西是重复的。如果可以把两套系统演进为流批一体,会减少很多冗余的计算