传统的流处理架构

状态放在系统外部

BB414FDE-D225-4B90-A94E-7392FC846BBC

比如统计实时的交易额,有何问题?

9B79CCBD-7A5C-49A2-AE95-9C9172EF4239

有状态流处理架构

状态放在系统内部

JVM的话存储在堆外内存 or 堆内内存

那有何问题?

FF122275-BC00-4A32-AA9E-D7DC71FFC9E8

想要系统稳定高效运行得解决这些问题:

25D5851F-E12F-440A-8204-5D266FC4CAA8

79441018-2303-4AF4-A512-F3CD174838EC

数据一致性

端到端的数据一致性如何实现?
如何在分布式场景下给多个拥有本地状态的运算子产生一个全域一致的快照?

global-consistent-snapshot

分布式快照

分布式快照2

状态容错

如何确保状态拥有精确一次 (exactly-once guarantee) 的容错保证?
快照操作如何实现?
更重要的是,如何在不中断运算的前提下产生快照?

状态容错2

状态容错3

checkpoint:按照周期性的全域一致快照集合。
savepoint:job 被 cancel 时,指定需要将当前全域一致快照进行存储,可以想成一个手动产生的 checkpoint,savepoint 记录着流式应用的所有运算单元的状态。

状态维护

状态如何存储和获取以及更新?
状态数据如何恢复?
状态后端存储如何选择?

通过 Flink 通过的 api 对状态进行读写

状态维护

状态维护2

状态维护3

状态维护4

状态保存和迁移

流计算应用是无时无刻在运行,维运上有几个重要考量:
更改应用逻辑或者修bug等,如何将前一执行的状态转移到新的执行里面去?
如何重新定义任务的并发度 ?
如何升级运算集群的版本号?

状态保存和迁移

Q.E.D.


知识的价值不在于占有,而在于使用