开发者社区> 问答> 正文

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

"是否有必要使用MapState.put()手动更新状态或修改对象时状态是否自动更新?

private transient MapState 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
问:如果我使用A方法,下次计数计算会自动更新相应的Mapstate状态吗?或者我需要使用B方法在计算完成后手动更新状态?
"

展开
收起
flink小助手 2018-11-28 15:55:20 5870 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    "从API的角度来看,你始终需要手动更新状态。

    但是,实际行为取决于状态后端。如果应用程序使用InMemoryStateBackend或者FsStateBackend,则所有本地状态都存储在工作进程的JVM堆上,即状态后端只保存对象的引用。因此,修改对象时会直接修改状态。

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

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

    2019-07-17 23:16:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载

相关镜像