什么叫做有状态? 某公司 Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。
什么是有状态,什么是无状态? 无状态我们可以简单认为:每次的执行都不依赖上一次或上N次的执行结果,每次的执行都是独立的。 有状态我们可以简单认为:执行需要依赖上一次或上N次的执行结果,某次的执行需要依赖前面事件的处理结果。
比如,我们现在要统计文章的阅读PV(page view),现在只要有一个点击了文章,在Kafka就会有一条消息。现在我要在流式处理平台上进行统计,那此时是有状态的还是无状态的? 假设我们要在Storm做,那我们可能将每次的处理结果放到一个“外部存储”中,然后基于这个“外部存储”进行计算(这里我们不用Storm Trident),那此时Storm是无状态的。 比如说:我存储将每次得到的数据存储到 Redis中,来一条数据,我就先查一下Redis目前的值是多少,跟Redis的值和现在的值做一次累加就完事了。 假设要在Flink做,Flink本身就提供了这种功能给我们使用,我们可以依赖Flink的“存储”,将每次的处理结果交由Flink管理,执行计算的逻辑。
可以简单的认为:Flink本身就给我们提供了”存储“的功能,而我们每次执行是可以依赖Flink的”存储”的,所以它是有状态的。
那Flink是把这些有状态的数据存储在哪的呢? 主要有三个地方:
如果假设Flink挂了,可能内存的数据没了,磁盘可能存储了部分的数据,那再重启的时候(比如消息队列会重新拉取),就不怕会丢了或多了数据吗? 看到这里,你可能在会在别的地方看过Flink的另外一个比较出名的特性:精确一次性 (简单来说就是:Flink遇到意外事件挂了以后,有什么机制来尽可能保证处理数据不重复和不丢失的呢) |