在我的flink程序中,我需要为每个键存储最新的100条上游记录,我决定使用keyBy和state来实现它。状态后端为Rocksdb。让我困惑的是我应该选择ListState还是ValueState。
例如下面的代码:
//In my KeyedProcessFunction, process each element
//use ListState
ListState<Record> listState;
Iterable<Record> records = listState.get();
List<Record> list;
…. // iterate the iterator and add record to the list, then add the new record and cut off
listState.update(list)
// use ValueState
ValueState<List<Record>> valueState;
List<Record> list = valueState.value();
…. //add new record to the list and cut off
valueState.update(list);
字符串
我看了一些文档,在文档中,他们推荐使用ListState而不是使用ValueState,但在我的场景中,两种方式都是,似乎我需要得到整个列表,修改它并将它全部存储到状态中,我不知道这样会不会造成不同的性能。我应该使用哪种更好的方法,并且可以获得更好的性能?
1条答案
按热度按时间vc9ivgsu1#
为了获得最佳性能,您需要使用
MapState<Long, Record>
和单独的ValueState<Long>
,在该ValueState<Long>
中跟踪当前值,作为Map状态的关键字。通过这种方式,您可以高效地添加新条目/删除最旧的条目,而不必每次都对整个列表进行反序列化和重新序列化。