从列表状态中删除选择性项目



我正在实现具有大状态(可能不适合内存(的自定义运算符。我正在尝试为此目的使用ListState。我正在使用

checkpointedState = context.getOperatorStateStore().getListState(descriptor);

如 https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/state.html#using-managed-operator-state 所述

在上面的链接中实现快照状态((会清除检查点状态,然后将内存中数据结构中的元素添加到检查点状态。

相反,我需要在快照状态((中如下所示的内容:

  1. 删除 checkpointedState 的特定条目,而不是 clear((。
  2. 将内存中数据结构中的新元素添加到检查点状态。

有没有办法有选择地从列表状态中删除项目?

不,不幸的是,从ListState中删除特定元素是不可能的。如果要保留特定的列表条目,则必须在清除ListState之前将它们提取到集合中,然后再次重新插入它们。

在您引用的示例中,所有状态对象都存储在 bufferedElements 变量中,并且仅在检查点完成时插入到ListState中。这意味着,完整的算子状态始终存储在 bufferedElements 中的 JVM 堆上。您也可以将运算符状态的一部分存储在ListState中(而不是将其保存在堆上(,但是访问单个元素的成本会很高,因为您必须遍历迭代器。

最新更新