Apache flink 什么时候使用瞬态,什么时候不使用flink?
在这段代码中,我应该使用Apache flink 什么时候使用瞬态,什么时候不使用flink?,apache-flink,Apache Flink,在这段代码中,我应该使用瞬态 什么时候可以使用transient 有什么区别 需要你的帮助吗 private Map<String, HermesCustomConsumer> topicSourceMap = new ConcurrentHashMap(); private Map<TopicAndPartition, Long> currentOffsets
瞬态
什么时候可以使用transient
有什么区别
需要你的帮助吗
private Map<String, HermesCustomConsumer> topicSourceMap = new ConcurrentHashMap();
private Map<TopicAndPartition, Long> currentOffsets = new HashMap<>();
private transient Map<TopicAndPartition, Long> restoredState;
private-Map-topicSourceMap=new-ConcurrentHashMap();
私有映射currentOffsets=新HashMap();
私有瞬态映射恢复状态;
TL;DR如果使用
transient
变量,最好在实现Rich
接口的操作符的open()
方法中实例化它。否则,请同时声明具有初始值的变量
这里使用的状态称为用户自己管理的原始状态。根据序列化目的,是否应使用
瞬态
修饰符。在你提交Flink工作之前。计算拓扑将生成并分布到Flink集群中。包括源和接收器在内的运算符将在代码中用字段实例化,例如,topicSourceMap
。变量topicSourceMap
和currentOffsets
已通过构造函数实例化。虽然restoredState是一个瞬态变量,因此无论您分配了什么初始值,它都不会被序列化并分发到某个要执行的任务中。因此,通常需要在实现Rich
接口的操作符的open()
方法中实例化它。在某个任务中反序列化此运算符后,将调用open()
方法来实例化您自己的状态。如果您使用的是scala,在open()
钩子中初始化瞬态变量的另一种方法是将它们设置为惰性,以便在第一次访问时初始化它们。e、 g.@transient lazy val topicSourceMap=new ConcurrentHashMap[String,HermesCustomConsumer]()