系列文章目录
Flink/Blink 原理漫谈(一)时间,watermark详解
Flink/Blink 原理漫谈(二)流表对偶性和distinct详解
Flink/Blink 原理漫谈(三)state 有状态计算机制 详解
Flink/Blink 原理漫谈(五)流式计算的持续查询实现 详解
Flink/Blink 原理漫谈(六)容错机制(fault tolerance)详解
State
首先,blink是有状态计算的,State是流计算特有的,流计算在 大多数场景 下是增量计算,数据逐条处理(大多数场景),每次计算是在上一次计算结果之上进行处理的,这样的机制势必要将上一次的计算结果进行存储(生产模式要持久化),另外由于 机器,网络,脏数据等原因导致的程序错误,在重启job时候需要从成功的检查点(checkpoint,后面篇章会专门介绍)进行state的恢复。增量计算,Failover这些机制都需要state的支撑。
除此外,状态也可以理解为是一个本地变量,可以被业务逻辑所访问。
State存储实现
Blink内部有四种state的存储实现,具体如下:
• 基于内存的HeapStateBackend - 在debug模式使用,不 建议在生产模式下应用;
• 基于HDFS的FsStateBackend - 分布式文件持久化,每次读写都产生网络IO,整体性能不佳;checkpoint存在远程的持久化文件系统上,本地状态存在taskmanager的JVM堆上。
• 基于RocksDB的RocksDBStateBackend - 本地文件+异步HDFS持久化,blink-1.x版本生产应用;将所有状态序列化,存入RocksDB中
• 还有一个是基于Niagara(blink2.x)NiagaraStateBackend - 分布式持久化,blink-2.x版本生产应用;
Blink-1.x版本选择用RocksDB+HDFS的方式进行State的存储,State存储分两个阶段,首先本地存储到RocksDB,然后异步的同步到远程的HDFS。 这样的而设计既消除了HeapStateBackend的局限(内存大小,机器坏掉丢失等),也减少了纯分布式存储的网络IO开销。

本文深入探讨Flink/Blink的有状态计算机制,包括State存储实现(HeapStateBackend、FsStateBackend、RocksDBStateBackend、NiagaraStateBackend)和分类(OperatorState、KeyedState)。讲解了状态一致性(at-most-once、at-least-once、exactly-once)以及端到端一致性,强调了Flink在保证一致性的前提下实现低延迟和高吞吐。
最低0.47元/天 解锁文章
631

被折叠的 条评论
为什么被折叠?



