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

2023-12-22

是否有必要使用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 or the FsStateBackend,所有本地状态都存储在工作进程的 JVM 堆上,即状态后端仅保存对象的引用。因此,当你修改对象时,状态会被直接修改。

如果您使用RocksDBStateBackend所有状态访问都被反/序列化并从 RocksDB 读取/写入 RocksDB。在这种情况下,修改对象不会对状态产生影响。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Flink:当我修改存储的对象时,MapState 是否会自动更新? 的相关文章

随机推荐