这是我参与⌈第四届青训营⌋笔记创作活动的第1天
引入
Why流式计算?
实时、快速、低延迟,无限流、动态、无边界数据源,持续运行
Why flink?
Apache Flink is a framework for stateful computations over unbounded and bounded data streams. Flink provides multiple APIs at different levels of abstraction and offers dedicated libraries for common use cases.
Why流批一体?
两套系统人力成本高、数据链路冗杂、数据口径不一致误差大
Flink开源生态与分层架构
内部架构详解
- SDK层:SQL/Table、DataStream、Python
- 执行引擎层(runtime层):三种SDK描述转化为统一的DAG图(一种描述数据处理的pipeline的逻辑表达方式),调度层(scheduler)再把DAG图转化为分布式场景下的task,task之间会通过shuffle service数据交互,状态数据存储在state backend
Flink整体架构
两个核心组件:
- Jobmanager(JM):调度task、触发协调task做checkpoint、协调容错恢复……
- Taskmanager(TM):执行一个DataFlowGraph的各个task、data streams的buffer、shuffle service数据交换
作业流程:
- Client:发起一个作业(DAG图);
- Dispatcher:拉起JM;
- JM:管理一个job的整个生命周期,向ResourceManager申请slot,调度task到对应的TM;
- ResourceManager:负责slot资源管理和调度,TM拉起后会向RM注册。
流批一体与Flink
流式计算steam和批式计算batch差异
流批一体的理论基础
批式计算是流式计算的特例everything is steam,无边界数据流按时间切段即可认为是有边界数据集
Flink如何流批一体
流批一体需要的模块:
- SQL层
- DataStream API层统一
- Schedule层架构统一
- Failover Recovery层架构统一
- Shuffle Service层架构统一
⌈ Schedule层 ⌋:逻辑DAG图转化为物理执行图并调度
调度模式:
- Eager(1.12之前)
- LAZY(1.12之前)
- Pipeline region
⌈ Shuffle service ⌋
1) Shuffle定义:上下游数据交互的过程(广义上所有涉及数据重分布repatition的过程均为shuffle)
2)基于不同分布式计算框架,shuffle有不同实现方式:
- 基于文件的Pull Based Shuffle:适合批作业,上下游传递时需要把数据写进文件,容错性高,如:spark、MR
- 基于Pipeline的Push Based Shuffle:数据存在内存不落盘不存储,通过网络数据交互,如:Flink、Storm、Presto
3) 流和批shuffle的差异:
| 数据生命周期 | 数据存储介质 | shuffle部署方式 | |
|---|---|---|---|
| 流作业 | shuffle数据与task绑定,task销毁shuffle数据也会消失 | 内存 | Pipeline:与计算节点部署在一起,减少网络开销,减少latency |
| 批作业 | 解耦 | 磁盘 | Blocking |
4) Flink的流批一体shuffle架构——可插拔shuffle service
- Netty shuffle service(默认):pipeline、blocking均支持
- Remote shuffle service:数据存进远端系统,提高容错性,减少机器宕机带来的损失,主要用于batch的blocking场景(批处理),对于pipeline性能会下降
Flink社区现状
实践——电商流批一体
[×]
[√]