这是我参与「第四届青训营 」笔记创作活动的第2天
流/批/OLAP 一体的 Flink 引擎介绍
1. Flink概述(背景、现状)
1. Apache Flink的诞生背景
大数据特点:价值化、海量化、快速化、多样化
流式计算:监控场景、金融风控、实时推荐(抖音推荐更感兴趣内容)等
- 批式计算(以前):
- 离线计算,非实时
- 静态数据集
- 小时/天等周期性计算 简单来说就是等待一批数据到齐
- 流式计算(现在):
- 实时计算,快速、低延迟
- 无限流、动态、无边界
- 7*24h持续运行
- 流批一体 简单理解为水龙头,源头数据流入水管中,有一些基本数据处理,再传递到下游,直到整个处理完成(实时)
2. why Apache Flink脱颖而出
流式计算引擎对比: Storm、Spark Streaming、Flink
- 状态容错Checkpoint
- 精确一次的计算语义Exactly-Once
- Window等高阶需求支持友好Dataflow编程模型
- 流批一体
3. Apache Flink开源生态
- 左边列前三:消息队列
- 中间:内部架构设计
- 底下:Flink部署模式
- 顶部:其他框架
2. Flink整体架构
1. Flink分层架构
- SDK层:SQL/Table、DataStream、pyFlink
- 执行引擎层(Runtime层):执行引擎层提供了统一的DAG,不管是流还是批,都会转化为DAG图,调度阶段再把DAG转换成分布式环境下的Task,Task之间做一些数据交换是通过Shuffe传输数据
- 状态存储层:状态数据
- 资源调度层:目前Flink可以支持部署在多种环境
2. Flink总体架构
JobManager(JM)
负责整个任务的协调工作
包括:调度task、触发协调Task做Checkpoint、协调容错恢复等;
- Dispatcher:接收作业
- JobMaster:申请资源,分配Task
- ResourceManager:资源管控
TaskManager(TM)
负责执行一个DataFlowGraph的各个task以及data streams的buffer和数据交换
Program code:不管SQL,python、JAVA都写在这里 Program code经过处理,转换为DAG的一张图,Client端会将逻辑图提交给JM,JM会将其转化为一个具体的物理执行图,并且JM根据任务调度,将Task调度到TM执行。
3. Flink作业示例
- 业务逻辑转换为一个Streaming DataFlow Graph
- 假设作业的Sink算子的并发配置为1,其余算子并发为2,紧接着会将上面的Streaming DataFlow Graph转化Parallel Dataflow(内部叫Execution Graph)
- 为了更高效地分布式执行,Flink会尽可能地将不同的operator链接(chain)在一起形成Task
- 这样每个Task可以在一个线程中执行,内部叫做OperatorChain
- 最后将上面的Task调度到具体地TaskManager中的slot中执行,一个slot只能运行同一个task的subTask
4. Flink如何做到流批一体
为什么需要流批一体: 播放量、创作者数据信息
痛点:
- 人力成本比较高
- 数据链路冗余
- 数据口径不一致
流式计算、批式计算对比: 流和批业务场景的特点、 批式计算相比于流式计算核心的区别
Flink如何做到流批一体:
(1)为什么能做到流批一体
- Flink是流式引擎
- 批式计算是流式计算的特例
- 有界数据集(批式数据)也是一种数据流
(2)如何做到流批一体
Apache Flink 主要从以下模块来做流批一体:
- SQL 层;
- DataStream API 层统一,批和流都可以使用 DataStream API 来开发
- Scheduler 层架构统一,支持流批场景
- Failover Recovery 层 架构统一,支持流批场景
- Shuffle Service 层架构统一,流批场景可以选择不同的 Shuffle Service
流批一体的Scheduler层:
Scheduler主要负责将作业的DAG转化为在分布式环境中可执行的Task
Flink支持两种调度模式:EAGER(Stream作业场景)、LAZY(Batch作业场景)
不管是流作业还是批作业,都是按照Pipeline Region粒度来申请资源和调度任务
-
ALL_EDGES_BLOCKING
A产生的数据不会立马发给B,需要写到磁盘,B也可以从A写出的文件读取数据
-
ALL_ENDGES_PIPELINED
A产生的数据直接发给B,中间不落盘,之间走到内存,内存发给B,然后直接释放
流批一体的Shuffle Service层:
- Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做Shuffle
- 实际上,分布式计算中所有涉及到上下游衔接的过程,都可以理解为Shuffle
Shuffle不同实现:基于文件的Pull Based Shuffle、基于Pipeline的Push Based Shuffle
流和批Shuffle之间的差异:
- Shuffle数据的生命周期
- Shuffle数据存储介质
- Shuffle的部署方式
Flink流批一体总结: 经过相应的改造和优化之后,Flink在架构设计上,针对DataStream层、调度层、Shuffle Service层,均完成了对流和批的支持
3. Flink架构优化
流/批/OLAP业务场景概述
三种业务场景的特点
三种业务场景为什么可以用一套引擎来解决
- 批式计算是流式计算的特例
- OLAP计算是一种特殊的批式计算
Flink OLAP 架构现状
- Client:提交 SQL Query
- Gateway:接收 Client 提交的 SQL Query,对 SQL 进行语法解析和查询优化,生成 Flink 作业执行计划,提交给 Session 集群
- Session Cluster:执行作业调度及计算,并返回结果
- 架构和功能模块:
- JobManager与Resource在一个进程内启动,无法对JobManager进行水平扩展
- Gateway与Flink Session Cluster互相独立,无法进行统一管理
- 作业管理及部署模块:
- JobManager处理和调度作业时,负责的功能比较多,导致单作业处理时间长、并占用了过多的内存
- TaskManager部署计算任务时,任务初始化部分耗时严重,消耗大量CPU
4. Flink精选案例讲解
电商流批一体实践
字节Flink OLAP实践