Apache flink flink-如何将状态用作缓存

Apache flink flink-如何将状态用作缓存,apache-flink,Apache Flink,我想读美国历史。如果状态为null,则读取hbase并更新状态,并使用onTimer设置状态ttl。问题在于如何批量读取hbase,因为从hbase读取单个记录效率不高。一般来说,如果要在Flink中缓存/镜像外部数据库的状态,最有效的方法是将数据库突变流式传输到Flink中-换句话说,如果数据库支持,将Flink转换为数据库的变更数据捕获CDC流的复制端点 我没有使用hbase的经验,但这是一个将卡夫卡置于hbase和flink之间可能会起作用的例子 如果您希望从Flink查询hbase,并且

我想读美国历史。如果状态为null,则读取hbase并更新状态,并使用onTimer设置状态ttl。问题在于如何批量读取hbase,因为从hbase读取单个记录效率不高。

一般来说,如果要在Flink中缓存/镜像外部数据库的状态,最有效的方法是将数据库突变流式传输到Flink中-换句话说,如果数据库支持,将Flink转换为数据库的变更数据捕获CDC流的复制端点

我没有使用hbase的经验,但这是一个将卡夫卡置于hbase和flink之间可能会起作用的例子

如果您希望从Flink查询hbase,并且希望避免一次对一个用户进行点查询,那么您可以构建如下内容:

              -> queryManyUsers -> keyBy(uId) -> 
streamToEnrich                                 CoProcessFunction
              -> keyBy(uID) ------------------->
在这里,您可以分割流,通过窗口或进程函数或异步i/o发送一个副本以成批查询hbase,然后将结果发送到保存缓存并进行扩展的协进程函数中


当记录沿着底部路径直接到达协处理器函数时,如果必要的数据在缓存中,则使用它。否则,记录将被缓冲,等待来自上层路径的缓存数据到达。

我只想从hbase读取同一用户的记录一次,因此我使用keyed state来记住已读取的记录。但这样,我只能从hbase读取一条记录。我想从hbase批量读取不同用户的记录,同时我想使用keyed state作为catch。有办法解决这个问题吗?我已经更新了我的答案,以便更明确地说明我关于flink查询hbase的解决方案的建议。非常感谢您的回答。有一点我不清楚。需要查询的用户在streamToBeEnriched中,如果我像这样构建streamToBeEnriched->queryManyUsers->keyByuserId,则不需要将状态用作缓存,所有记录都将从hbase获取。您可以拆分streamToBeEnriched。如果缓存为空,则具有缓存的操作员只需等待查询hbase的流。