Flink流批一体和Exactly-Once语义 | 青训营笔记

100 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第三天。

Flink流批一体和Exactly-Once前半

Scheduler层

pipeline region

Shuffle Service层

  • 基于文件的 Pull Based Shuffle:Spark,MR

  • 基于Pipeline的 Push Based Shuffle:Flink,Storm,Presto

流和批Shuffle差异:

  1. Shuffle数据生命周期:Shuffle与task在流作业中绑定,在批作业中解耦

  2. Shuffle数据存储介质:流处理Shuffle数据存储在内存

  3. Shuffle的部署方式:流作业Shuffle服务与计算节点部署在一起

Netty Shuffle Service,支持pipeline和blocking的shuffle,Flink默认

Remote Shuffle Service,支持pipeline和blocking的shuffle,常用于blocking shuffle

字节内部批处理使用cloud shuffle service

Shuffle策略存在不同,但本质上是对数据进行Re-Partition,架构是统一的。

OLAP

延迟约1~10秒,但要求高并发查询

OLAP被认为是特殊的批式计算,而Flink下批式数据被视作特殊的流式数据

Flink OLAP架构

  • Client

  • Gateway

  • Session Cluster

Flink应对OLAP的优化方向

架构层面:JM与RM在同一个线程启动,无法对JM进行水平扩展;Gateway与Session Cluster相互独立,无法统一管理。

作业管理:JM处理调度作业时负责功能多,单作业处理时间长,内存占用多;TM初始化对时间、CPU资源消耗高。

资源管理:资源申请及释放链路过长;JM管理slot资源,感知不到TM维度的资源分布

其他:作业心跳与Failover机制,并不合适AP这种秒级或毫秒级计算场景;AP目前使用Batch算子进行计算,这些算子初始化(申请内存等)比较耗时;

Exactly-Once 在Flink中的实现

数据&动态表

在流上定义动态表

查询的到的表也是动态的,Continuous Query

At-Least-Once 数据一定被消费但可能重复消费

Exactly-Once 数据一定被消费且只被消费一次

Exactly-Once与Checkpoint

Chandy-Lamport算法

source算子收到JM发送的Checkpoint Barrier表示状态快照制作的开始

后续算子在保存状态后向下游继续发送Checkpoint Barrier并告知JM状态记录已完成并继续工作

算子会等到所有的上游算子的Checkpoint Barrier到达后开始状态快照的制作