二、Flink源码分析系列之--名次概念解释
1.什么是Flink?
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams.
Apache Flink是一个分布式处理引擎的框架,用对“有界数据“ 和“无界数据”流进行状态计算
1.1有界流和无界流怎么理解?
- Unbounded streams :have a start but no defined end.
- Bounded :streams have a defined start and end.
简单的来说,无界流就是有开始,没有结束。有界流就是有开始,也有结束
1.2 有状态流式处理怎么理解?
传统流计算处理方式:
以时间划分,划分成一个一个批次,用批次运算引擎spark或mr去处理。但是举个例子:
- a. 要实现每一个小时事件A->事件B conversion出现的次数
- b. 而且假设A发生在3点59分,B发生在4点01分
- c .先接受到B,在接收到A
那么上述的情况如何处理呢?
上述情况下就需要有一个中间状态保存中间计算结果,而且累积的状态会影响结果的产出。这就是我所理解的状态计算。
综上总结下状态流计算的特点:
- a.有办法累积和维护大量的状态
- b.有办法依据时间决定所有的数据都接收完毕才产生结果,可以产出精准的result
2.Flink对状态计算的处理
2.1 状态容错(State Fault Tolerance)
如何确保状态拥有exactly-once guarantee的容错保证?
在每次触发计算完成后,对结果进行一次snapshot保存
例如:
第x次计算,保存x的位置和x的状态
第y次计算,保存y的位置和y的状态
但是 flink 在计算时是分布式计算,那么就需要保证每个节点的operator的状态在进行保存时全部保存,那么flink设计了global consisent snapshot 即全局一致的快照,也被称为checkpoint。checkpoint功能实现状态的保存,在故障恢复时会重新读取保存在dfs上的checkpoint进行恢复。
那么分布式快照(distributed snapshots)是如何实现的呢?
flink引入了checkpoint barrier的概念来实现全局一致快照,后续章节我们会详细讲解。
2.2 状态维护( state Management)
注册状态
在flink中调用以下方法进行状态注册
val state = getRuntimeContext().getState();
state 很小的时候可以在本地内存进行维护,加入state很大,则可以使用RocksDb进行状态维护,代价就是在状态写入和读取的时候需要进行序列化和反序列化。
2.3 Event-Time处理( event-time processing)
首先需要理解三种time的含义:
- Processing time: Processing time refers to the system time of the machine that is executing the respective operation. 处理事件时的时间
- Event time: Event time is the time that each individual event occurred on its producing device. 事件产生的时间
- Ingestion time: Ingestion time is the time that events enter Flink. 事件进入flink的时间
假设我们需要计算3点到4点直接数据的count数,我们应该在什么时间去触发计算呢?在flink中引入了一个watermarks机制来进行处理。
watermarks:
watermarks是flink中的特殊事件,一个带有时间戳t的watermark会让opeator不会在接受任何小于t的事件
2.4 状态保存与迁移(save point and Migration)
流式计算是一直在运行的,那么当你需要
- 更改逻辑
- 版本升级
- 并行度调整
不得不停掉服务的时候,而且希望在重启后接着上次的位置继续进行计算,在flink中采用savepoint进行实现。savepoint可以理解成一个手动的checkpoint.
3.Flink的架构
Flink可以部署在多种环境下
- yarn
- mesos
- stand-alone
- k8s
4.Flink的API
flink提供了三层api供开发者使用,如下图
- ProcessFunctions提供对时间和状态的细粒度控制,实现复杂的事件业务逻辑,控制力度细,抽象能力差。
- DataStream API 一般面向开发者,介于两者之间
- SQL & Table API 即我们使用的sql,操作简单上手容易,但是控制力度比较粗,抽象能力强