根据存储对象的属性修剪flink状态

时间:2020-11-05 09:37:04

标签: java state apache-flink flink-streaming

考虑以下示例类,其实例存储在events={[{ "status": "pending", start: moment().toDate(new Date(2020, 10, 11, 10, 0)), end: moment().toDate(new Date(2020, 10, 11, 17, 0)), "title": "Michael Scott", 'allDay': false, }]} 中:

ListState

如果与特定客户的最后一笔交易(class BusinessObject { long clientId; String region; Instant lastDealDate; bool isActive; } )距已满1年,则应用程序要求该对象不应处于flink状态。未启用,即lastDealDate

解决此问题并使flink知道这两个因素以便自动删除这些条目的正确方法是什么?目前,我读取了该状态中的所有项目,清除了状态,然后重新添加了相关的项目,但是随着客户端数量的增加和状态的规模变大,这将花费很长时间。我的大多数在线搜索都谈论使用isActive == false并通过time-to-live将其设置为我的状态。但是,我的逻辑不能依赖处理/事件/摄取时间,因此我还需要检查descriptor是否为假。

其他信息:上下文未设置键,后端为RocksDB。使用isActive的原因是因为每天都需要丢弃上述条件下的所有相关状态/历史记录。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

有了RocksDB状态后端,Flink可以在不进行序列化/反序列化的情况下追加到ListState,但是由于ser / de,除追加外的任何读取或修改都是昂贵的。

即使您偶尔需要遍历整个地图,如果可以重新做一些事情以使这些BusinessObjects存储在MapState中,您的状况也会更好。 MapState中的每个键/值对将是一个单独的RocksDB条目,您将能够分别创建/更新/删除它们,而不必对整个地图进行ser / de(除非必须扫描它)。 。 (为此,在RocksDB中迭代MapState的价值在于按序列化键排序的顺序遍历地图。)

MapState仅可用作键控(或广播)状态,因此此更改将要求您键控流。使用keyBy确实会强制进行网络改组(和ser / de),因此它将很昂贵,但不如使用ListState昂贵。

相关问题