Flink原始和管理声明什么时候用?

pb3skfrl  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(282)

假设我有以下代码。引擎由这个抽象类的实现初始化,它是一个包含哈希表的复杂类。这样宣布有什么坏处?据我所知,这既不是原始状态,也不是管理状态。我应该用其中一个吗?为什么?
这里描述了托管状态,并使用flink库中现有的类(例如valuestate)。
另一方面,这里描述了原始状态,根据我所见,它只能在扩展abstractstreamoperator类时使用,而不是在这里(richmapfunction是扩展的)(将给出一个代码示例)

abstract class EmbeddedEngineMap(fsmList: List[FSMInterface],
                             predList: List[PredictorInterface],
                             predictorEnabled: Boolean,
                             expirationTime: Long,
                             collectStats: Boolean,
                             finalsEnabled: Boolean,
                             distance: (Double,Double)) extends RichMapFunction[GenericEvent, Unit] {

       protected var engine: ERFEngine = _
       ....
}
zc0qhyus

zc0qhyus1#

基本上,如果你不使用flink状态,这意味着你的 ERFEngine 将在每次启动或重新启动作业时示例化为新对象。这基本上意味着如果在执行任务的过程中 engine 保持某些状态当作业失败、重新启动或停止时,它将丢失。
我不会描述原始状态和托管状态之间的区别,因为您引用的帖子做得很好。基本上,原始状态是一个相当低级的api,它允许您实现自己的操作符,因此通常,托管状态是首选的,因为它利用了一些flink功能(例如允许在并行度更改时重新分布),并且通常更易于使用。

相关问题