这是我参与[第四届青训营]笔记创作活动的第2天
本堂课内容:
- Flink概述
- Flink整体构架
- Flink架构优化
- 精选案例讲解
一、Flink概述
1.1 背景
1.1.1什么是大数据
指无法在一定时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合
1.1.2为什么需要流式计算
- 大数据的实时性带来价值更大,比如:
- 监控场景
- 金融分控
- 实时推荐
- ...
- 大数据实时性的需求,带来了大数据计算架构模式的变化
1.2 为什么是Apache Flink会脱颖而出
1.2.1流式框架对比
1.2.2Why Flink
二、Flink整体构架
2.1 Flink分层架构
- SDK层:FLink的SDK目前主要有三类:SQL/Table、DataStream、Python
- 执行引擎层(Runtime层):执行引擎层提供了统一的DAG用来描述数据处理的Pipeline,不管是流还是批,都会转化为DAG图,调度层再把DAG转化为分布式环境下的Task,Task之间通过Shuffle传输数据
- 状态存储层:负责存储算子的状态信息
- 资源调度层:目前Flink可以支持部署在多种环境
2.2 Flink总体架构
Flink集群中,两个核心组件:
- JobManager(JM): 负责整个任务的协调工作,包括:调度Task,触发协调Task做Checkpoint,协调容错恢复等
- TaskManager(TM): 负责执行一个DataFlow Graph的各个task以及data streams的buffer和数据交换
2.3 Flink作业示例
流式的WordCount示例
业务逻辑转换为一个Streaming DataFlow Graph
Parallel Dataflow
假设作业的sink算子的并发配置为1,其余算子并发为2,紧接着会将上面的Stream DataFlow Graph 转化为Parallel Dataflow(内部叫Execution Graph)
OperatorChain
为了更高效地执行分布式执行,Flink会尽可能地将不同的operator链接(chain)在一起形成Task。这样每个Task可以在一个线程中执行,内部叫做OperatorChain,如下图的source和map算子可以Chain在一起
注:这样可以减少线程的切换,提高了整个集群的吞吐能力;对于什么算子可以Chain在一起,是有条件的
2.4 Flink如何做到流批一体
2.4.1为什么需要流批一体
传统的离线数仓和实时数仓:
上述架构的痛点:
- 人力成本比较高:批、流两套系统,相同逻辑需要开发两遍
- 数据链路冗余:本身计算内容是一致的,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费
- 数据口径不一致:两套系统、两套算子、两套UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰
2.4.2 如何做到流批一体
站在Flink的角度,Everything is Streams,无边界数据集是一种数据流,一个无边界的数据流可以按照时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是一种数据流。因此,不管是有边界的数据集(批式数据)还是无边界数据集,Flink都可以天然支持,这是Flink支持流批一体的基础。并且Flink在流批一体上,从上面的API到底层的处理机制都是统一的,是真正意义上的流批一体
2.4.3流批一体的Scheduler层
Scheduler主要负责将作业的DAG转化为在分布式环境中可以执行的Task。
在1.12之前的Flink版本中,Flink支持以下两种调度模式:
EAGER
16个task会一起调度,集群需要有足够的资源
LAZY
最小调度一个task 即可,集群有1个slot资源可以运行
ALL_EDGES_BLOCKING:
- 所有Task 之间的数据交换都是BLOCKING模式
- 分为12个 pipeline region
ALL_EDGES_PIPELINED:
- 所有Task 之间的数据交换都是IPELINE模式
- 分为1个pipeline region
注:由Pipeline的数据交换方式连接的Task构成为一个Pipeline Region;本质上,不管是流作业还是批作业,都是按照 Pipeline Region粒度来申请资源和调度任务。
2.4.4 流批一体的Shuffle Service层
Shuffle
在分布式计算中,用来连接上下游数据交互的过程叫做 Shuffle
流和批Shuffle之间的差异
- Shuffle数据的生命周期:流作业的 Shuffle数据与Task是绑定的,而批作业的 Shufle数据与Task 是解耦的;
- Shuffle数据存储介质︰流作业的生命周期比较短、而且流作业为了实时性,Shufle通常存储在内存中,批作业因为数据量比较大以及容错的需求,一般会存储在磁盘里;T53. Shuffile的部署方式∶流作业 Shuffle服务和计算节点部署在一起,可以减少网络开销,从而减少latency,而批作业则不同.
- Shuffile的部署方式∶流作业 Shuffle服务和计算节点部署在一起,可以减少网络开销,从而减少latency,而批作业则不同。