如何在查询数据中使用Apache Flink?

时间:2019-04-15 21:36:02

标签: apache-flink

嗨,

使用Apache Flink 1.8。我有来自Kafka的记录流,它们是JSON并进行过滤,一切正常。

现在,我想通过数据库表中的查找值来丰富Kafka的数据。

仅是创建2个流,将表加载到第2个流中,然后联接数据的情况?

数据库表确实得到更新,但更新不频繁,我想避免在流中通过的每条记录上查找数据库。

1 个答案:

答案 0 :(得分:1)

Flink具有状态,您可以在这里利用它。我做过类似的事情,从查询表中进行每日查询(在我的情况下,这是一个批量Web服务调用),然后将结果转换为kafka主题。该kafka主题被同一服务flink作业占用,因为该作业需要用于查找的数据。这两个主题都使用相同的值进行键控,但是我使用查找主题将数据存储为键控状态,并且在处理另一个主题时,我会将数据拉出状态。

我还有一些其他逻辑来检查给定密钥是否还没有状态。如果是这样,我会向Web服务发出异步请求。但是,您可能不需要这样做。

这里需要说明的是,我有用于状态管理的内存,而我的查询表只有大约3000万条记录,大约有100个演出分布在15个节点上的45个插槽中。

[在评论中回答问题] 抱歉,但是我的回答太长,因此必须编辑我的帖子:

我有一个python作业,可通过批量REST调用加载数据(您可以执行数据查找)。然后将数据转换为正确的格式,然后将其转储到Kafka中。然后我的flink流有两个来源,一个是“真实数据”主题,另一个是“查找数据”主题。来自查找数据主题的数据以状态存储(我使用了ValueState,因为每个键都映射到一个可能的值,但是有other state types。我也为每个条目设置了24小时的过期时间,但这是我的用例。

诀窍在于,将值存储在查找主题的状态中的同一操作必须是将值从“真实”主题拉回状态的操作。这是因为flink状态(甚至键状状态)与创建它们的运算符相关。