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