apache-flink - Apache 弗林克 : Is MapState automatically updated when I modify a stored object?

标签 apache-flink flink-streaming

是否需要使用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,所有状态访问都会被反序列化并从 RocksDB 读取/写入。在这种情况下,修改对象不会对状态产生影响。

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

关于apache-flink - Apache 弗林克 : Is MapState automatically updated when I modify a stored object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53257240/

相关文章:

java - Maven 构建缺少包链接

java - 使用基于计数的窗口连接两个流

apache-flink - 如果数据源一段时间没有发出数据,Flink算子的水印会继续前进吗?

apache-flink - Flink Logging 获取作业名称或作业 ID

apache-flink - 使用 flink runner 时如何在 apache Beam 中执行检查点?

java - apache flink 无法解析导入

java - 如何重新启动 flink 作业以使用添加的 TaskManager

apache-flink - 如何通过 Flink Table API/SQL 中的数据流 API 在给定键和公共(public)窗口上连接三个或更多数据流/表?

hadoop - ECS 中的 Flink 找不到着色的 ContainerCredentialsProvider

使用 Apache Flink 对数据流进行排序