Hi, 我尝试一下从一个场景来阐述一下状态的定义吧,这样容易理解一些。
比如我们要做一个窗口的聚合。那这个聚合的结果可以认为是一个中间状态,这个状态在窗口没有结束之前, 是不会输出到下游的。如果我们只是把这个状态放到内存里,那中间如果任务挂了,这个状态就丢了。 如果框架没有提供状态的能力,一般我们就会选择把这个中间结果存储到外部的kv系统(比如hbase)里,每当窗口内来了 一条数据,就更新一下这个结果,并且存储到外部的kv系统。这样子如果中间任务挂了,重启起来的时候我们还能 从外部kv系统里拿到这个状态继续计算,不会导致计算结果不准确。但是这个只是一定程度上缓解了中间结果的丢失 问题,但是仍然很难提供精准的exactly-once的计算语义,因为你没法保证读到的这条数据commit offset和把中间结果 到外部kv在一个原子操作里。 但是如果框架本身提供了状态的能力呢,我们就不需要自己再去处理这种问题了。这个中间结果可以直接存储到 Flink内置的状态里。然后依靠Flink的checkpoint机制来把状态定期保存到外部系统(比如HDFS)。这样子就可以保证 任务失败重启的时候,可以从我们的checkpoint来恢复,来保证计算结果的exactly-once的语义。 i'mpossible <[email protected]> 于2020年4月26日周日 下午4:18写道: > Hi: > 我想知道有状态计算、无状态的计算的具体定义是什么?能否给出具体的应用场景; > > Flink官网介绍Flink时,给出定义是 "用于在无边界和有边界数据流上进行有状态的计算",但是没有介绍状态的具体含义, > 和有状态、无状态计算的应用场景,以及他们的差异,令人感到抽象; > > 感谢社区的小伙伴解答! -- Benchao Li School of Electronics Engineering and Computer Science, Peking University Tel:+86-15650713730 Email: [email protected]; [email protected]
