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]()