这是我参与「第四届青训营 」笔记创作活动的第2天
Flink概述
Flink诞生背景
1.大数据
Big Data:指在一定时间内无法用常规软件工具对其进行获取、存储、管理和处理的数据集合
具有价值化、海量化、快速化、多样化特点
2.大数据计算架构发展历史
3.流式计算的产生
大数据时代,实时性具有很大的价值
- 监控场景:如果能实时发现业务系统的健康状态,就能提前避免业务故障
- 金融风控:实时监测出异常交易的行为
- 实时推荐:抖音推荐
- ...
实时性推动了大数据计算架构模式的变化
Flink的脱颖而出
Flink开源生态
Flink整体架构
Flink分层架构
- SDK层:Flink目前的SDK主要有三类:SQL/Table、DataStream、Python
- 执行引擎层:提供了统一的DAG,用来描述数据处理的Pipeline,不管流还是批都会转化为DAG图,调度层再把DAG转化成分布式环境下的Task,task之间通过Shuffle传输数据
- 状态存储层:负责存储算子的状态信息
- 资源调度层:Flink可以支持部署再多种环境
Flink总体架构
一个Flink集群主要包含两个核心组件:
- JobManager(JM):负责整个任务协调工作,包括:调度Task,触发协调Task做CheckPoint,协调容错恢复等
- TaskManager(TM):负责执行一个DataFlow Graph的各个Task以及data streams 的buffer和数据交换
JobManager
- Dispatcher:接收作业,拉起JobManager执行作业,并在JobManager挂掉之后恢复作业
- JobMaster:管理一个job的整个生命周期,会向ResourceManager申请slot,并将task调度到对应的TM上
- ResourceManager:负责slot资源的管理和调度,TaskManager拉起之后会向RM注册
Flink实现流批一体
1. 为什么需要流批一体
应用角度:
- 实时统计一个短视频的播放量、点赞数、抖音直播间的实时观看人数----流
- 按天统计创造者的一些数据信息,例如播放量、评论量、广告收入------批
实现架构:
上述架构的痛点:
- 人力成本高:批、流两套系统,相同逻辑需要开发两遍
- 数据链路冗余:本身计算内容一直,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费
- 数据口径不一致:两套系统、两套UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰
2.流批议题的挑战
流批业务场景
批式计算相比于流式计算核心区别
3.Flink为什么可以做到流批一体
批式计算可以看作流式计算的特例,Everything is Streams,有界数据集也是一种特殊的数据流。站在Flink 的角度,Everything is Streams,无边界数据集是一种数据流,一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是一种数据流。因此,不管是有边界的数据集(批式数据)还是无边界数据集,Flink都可以天然地支持,这是Flink支持流批一体的基础。并且Flink在流批一体上,从上面的API到底层的处理机制都是统一的,是真正意义上的流批一体。
Apache Flink主要从以下几个模块来做流批一体:
- SQL层;
- DataStream API层统一,批和流都可以使用DataStream API来开发;
- Scheduler层架构统一,支持流批场景;
- Failover Recovery层架构统一,支持流批场景;
- Shuffle Service层架构统一,流批场景选择不同的 Shuffle Service;