是否需要使用MapState.put()
手动更新状态,或者是否在我修改对象时自动更新状态?
private transient MapState<String, Word> words;
.......
Word w = words.get(word);
if (w == null) {
w = new Word(word);
//words.put(word, w); //A
}
if (....) {
w.countBad(1); // countXXX modifies a the private variable in a Word object
} else {
w.countGood(1);
}
//words.put(word, w); //B
Q:如果我使用A方法,下一次计数计算会自动更新对应的Mapstate
状态吗?还是需要在计算完成后使用B方法手动更新状态?
最佳答案
从 API 的角度来看,您始终需要手动更新状态。
但是,实际行为取决于状态后端。如果应用程序使用 InMemoryStateBackend
或 FsStateBackend
,则所有本地状态都存储在工作进程的 JVM 堆中,即状态后端仅持有对该对象的引用.因此,当您修改对象时,状态会直接被修改。
如果您使用 RocksDBStateBackend
,所有状态访问都会被反序列化并从 RocksDB 读取/写入。在这种情况下,修改对象不会对状态产生影响。
我建议始终显式更新状态,因为这将确保您可以在不调整应用程序逻辑的情况下切换状态后端。
关于apache-flink - Apache 弗林克 : Is MapState automatically updated when I modify a stored object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53257240/