Apache Flink使用ListState或ValueState

pnwntuvh  于 2023-08-01  发布在  Apache
关注(0)|答案(1)|浏览(117)

在我的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,但在我的场景中,两种方式都是,似乎我需要得到整个列表,修改它并将它全部存储到状态中,我不知道这样会不会造成不同的性能。我应该使用哪种更好的方法,并且可以获得更好的性能?

vc9ivgsu

vc9ivgsu1#

为了获得最佳性能,您需要使用MapState<Long, Record>和单独的ValueState<Long>,在该ValueState<Long>中跟踪当前值,作为Map状态的关键字。
通过这种方式,您可以高效地添加新条目/删除最旧的条目,而不必每次都对整个列表进行反序列化和重新序列化。

相关问题