我正在实现具有大状态(可能不适合内存(的自定义运算符。我正在尝试为此目的使用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 所述
在上面的链接中实现快照状态((会清除检查点状态,然后将内存中数据结构中的元素添加到检查点状态。
相反,我需要在快照状态((中如下所示的内容:
- 删除 checkpointedState 的特定条目,而不是 clear((。
- 将内存中数据结构中的新元素添加到检查点状态。
有没有办法有选择地从列表状态中删除项目?
不,不幸的是,从ListState
中删除特定元素是不可能的。如果要保留特定的列表条目,则必须在清除ListState
之前将它们提取到集合中,然后再次重新插入它们。
在您引用的示例中,所有状态对象都存储在 bufferedElements
变量中,并且仅在检查点完成时插入到ListState
中。这意味着,完整的算子状态始终存储在 bufferedElements
中的 JVM 堆上。您也可以将运算符状态的一部分存储在ListState
中(而不是将其保存在堆上(,但是访问单个元素的成本会很高,因为您必须遍历迭代器。