从ListState

时间:2017-11-20 07:30:53

标签: apache-flink

我正在实现具有大状态(可能不适合内存)的自定义运算符。我正在尝试使用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()中使用以下内容:

  1. 删除checkpointedState的特定条目,而不是clear()。
  2. 将内存数据结构中的新元素添加到checkpointedState。
  3. 有没有办法有选择地从ListState中删除项目?

1 个答案:

答案 0 :(得分:3)

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

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