这是我参与「第四届青训营 」笔记创作活动的的第3天
今天我们来总结一下Flink引擎的课程内容,先来介绍一下流、批计算他们各自的特点和应用场景。
批式计算
批式计算,通俗的讲就是对静态数据的处理,例如在用户使用app的过程中,截取9:00到22:00这一段时间用户的操作数据,对用户的行为进行分析。从上我们可以看出一个特点,就是批计算是对过去的数据进行处理,需要处理的数据总量不变。
流式计算
流式计算,可以看成你对一段源源不绝的数据进行处理,实时性要求很高,例如,你在抖音上刷了同一类视频多次,系统就会实时获取你的数据,分析出你可能偏好这类视频,在你刷下一个视频时,出现这类视频的概率就更高了。
在大数据的场景下,流式计算带来的实时性价值更大,因此,下面我们来了解一下主流的流式引擎Flink
- 流式计算框架的对比:
让Flink脱颖而出的几个特点:
- Exactly-Once(数据只计算一次)
- Checkpoint(状态容错)
- Dataflow编程模型
- 流批一体
此外,在Flink开源社区环境中,对多种数据库的支持也让开发者们更青睐于Flink 如Kafka, RocketMQ, RabbitMQ, Redis, HDFS, Hive, Clickhouse等。
Flink架构
- Flink分层架构
SDK这边,Flink以SQL/Table, DataStream, Python这三类为主, 在执行引擎层,不论是流还是批,Flink都会将其转换为DAG图,再转换成分布式环境下的Task,多个Task之间采用shuffle进行通讯,状态储存层负责储存算子的状态,资源调度层,Flink可以支持部署在多种引擎上,如K8s, Yarn。
为什么需要流批一体
前面我们说到了Flink引擎的一个特点,那就是支持流批一体,为什么需要流批一体呢?
在一个应用当中,流处理和批处理一般都会用到,例如上面提到的抖音实时对用户喜好进行推荐,这就是流计算的应用;如果你是一个视频创作者,你可能需要对你的视频播放量分析,这就是批计算的应用,在同一个业务层,流计算和批计算是要分2套流程来进行的:
相同的逻辑需要运行两遍,这对开发者来说无疑是增加了工作量,这两套系统在计算中,通常会产生一定的误差,业务方们要处理这些误差,也需要支付一定的开销。因此,对流批一体的支持,是开发者们迫切希望的。
Flink实现流批一体
以宏观的角度来看,批数据是有限的数据流,而流数据是无限的数据流,以Flink的角度来看:Everything is Streams,和数学的微积分相似,我们可以将无限的数据流拆分成一个个有限的数据流组合而成,这样在理论上就有了实现的方法,那么,Flink是如何做到流批一体的呢。 主要靠以下几个模块:
- SQL层;
- DataSteam API层统一,批和流都可以使用DataStream API来开发;
- Scheduler 层架构统一,支持流批场景;
- Failover Recovery 层架构统一,支持流批场景;
- Shuffle Service 层架构统一,流批场景选择不同的Shuffle Service;
经过上述模块在不同层面对流和批的支持,Flink就已经可以支持多种流、批的使用场景了。