这是我参与「第四届青训营 」笔记创作活动的第2天
1 Fink概述
为什么会有流式计算的需求,为什么Flink能够脱颖而出,Fink当前的开源生态 Flink是一个Stateful Computations Over Streams,即数据流上的有状态的计算。这里面有两个关键字,一个是Streams,Flink认为有界数据集是无界数据流的一种特例,所以说有界数据集也是一种数据流,事件流也是一种数据流。Everything is streams,即Flink可以用来处理任何的数据,可以支持批处理、流处理、AI、MachineLearning等等。另外一个关键词是Stateful,即有状态计算。有状态计算是最近几年来越来越被用户需求的一个功能。举例说明状态的含义,比如说一个网站一天内访问UV数,那么这个UV数便为状态。Flink提供了内置的对状态的一致性的处理,即如果任务发生了Failover,其状态不会丢失、不会被多算少算,同时提供了非常高的性能。
计算的需求
批式计算:
- 离线计算,非实时
- 静态数据集
- 小时/天等周期性计算
流式计算:
- 实时计算、快速、低延迟
- 无限流、动态、无边界
- 7*24小时持续运行
- 流批一体
近年来,流处理变得越来越流行。实时数据分析有更大的价值所在,而现在许多系统都是连续的事件流,除了互联网领域,车联网,电力系统,穿戴设备等等的数据都是以事件流的方式收集并处理的。但目前为止大多数公司并没有用流处理的方式解决实时大数据分析的问题,原因可能是有限数据的存储更容易,而sql等分析方式也更简单。但只有用流的方式处理这种数据才是更符合实际的,当然这个困难很大,涉及数据一致性与时间的问题,其实已经属于物理学范畴。
Flink
Apache Flink是一个用于在数据流上进行有状态计算的框架和分布式处理引擎,擅长处理无界和有界数据集,可以部署到任意常见的集群环境中,运行任意规模的应用,同时Flink针对本地状态访问进行了优化,任务的状态始终保持在内存中,保证了非常低的处理延时。
Flink的SDK支持SQL、DataStream和Python。
2 Flink整体架构
Flink当前的整体架构介绍,一个Flink作业如何调度和运行起来,Flink如何做到流批一体
Flink架构
- SDK层:SQL/Table、DataStream、Python
- 执行引擎层(runtime层):三种SDK描述转化为统一的DAG图(一种描述数据处理的pipeline的逻辑表达方式),调度层(scheduler)再把DAG图转化为分布式场景下的task,task之间会通过shuffle service数据交互,状态数据存储在state backend
两个核心组件
- 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注册。
3 Flink架构优化
流/批/OLAP三种业务场景概述,Flink如何来支持OLAP场景需求,需要做哪些架构上的优化。
批式计算是流式计算的特例everything is steam,无边界数据流按时间切段即可认为是有边界数据集
流批一体需要的模块
- SQL层
- DataStream API层统一
- Schedule层架构统一
- Failover Recovery层架构统一
- Shuffle Service层架构统一
调度模式:
- Eager(1.12之前)
- LAZY(1.12之前)
- Pipeline region
Shuffle service
- Shuffle定义:上下游数据交互的过程(广义上所有涉及数据重分布repatition的过程均为shuffle)
- 基于不同分布式计算框架,shuffle有不同实现方式:
- 基于文件的Pull Based Shuffle:适合批作业,上下游传递时需要把数据写进文件,容错性高,如:spark、MR
- 基于Pipeline的Push Based Shuffle:数据存在内存不落盘不存储,通过网络数据交互,如:Flink、Storm、Presto
- 流和批shuffle的差异:
| 数据生命周期 | 数据存储介质 | shuffle部署方式 | |
|---|---|---|---|
| 流作业 | shuffle数据与task绑定,task销毁shuffle数据也会消失 | 内存 | Pipeline:与计算节点部署在一起,减少网络开销,减少latency |
| 批作业 | 解耦 | 磁盘 | Blocking |
- Flink的流批一体shuffle架构——可插拔shuffle service
- Netty shuffle service(默认):pipeline、blocking均支持
- Remote shuffle service:数据存进远端系统,提高容错性,减少机器宕机带来的损失,主要用于batch的blocking场景(批处理),对于pipeline性能会下降
4 精选案例讲解
选择两个字节内部的真实案例场景,介绍Flink在流批一体以及OLAP上的实践
- 电商流批一体