Apache Flink:当我修改存储的对象时,MapState 会自动更新吗?

Apache Flink: Is MapState automatically updated when I modify a stored object?

是否需要使用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的角度来看,您总是需要手动更新状态。

但是,实际行为取决于状态后端。如果应用程序使用 InMemoryStateBackendFsStateBackend,则所有本地状态都存储在工作进程的 JVM 堆中,即状态后端仅持有对该对象的引用。因此,修改对象时直接修改状态。

如果你使用 RocksDBStateBackend 所有状态访问都是 de/serialized 并且从 RocksDB 读取/写入。在这种情况下,修改对象不会对状态产生影响。

我建议始终显式更新状态,因为这将确保您可以在不调整应用程序逻辑的情况下切换状态后端。