Apache flink 在Flink数据流中加入元数据的最佳方式是什么?

Apache flink 在Flink数据流中加入元数据的最佳方式是什么?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我们有一个kafka事件流,我们希望使用驻留在MySQL数据库中的一些元数据来丰富它 元数据每隔几个小时更改一次。本质上,我们希望定期读取数据库,并使用新的元数据不断丰富事件 一种方法是将广播状态与每隔几分钟/小时读取DB的周期性源一起使用。广播此流并使用它加入。但问题可能是广播流的第一次读取可能比从卡夫卡流读取的某些消息要晚 有更好的方法吗?您可以使用Flink SQL来实现这一点。根据具体的需求,您可以对MySQL数据库中的CDC流执行操作,也可以对MySQL执行操作(可能启用了) 另见 更

我们有一个kafka事件流,我们希望使用驻留在MySQL数据库中的一些元数据来丰富它

元数据每隔几个小时更改一次。本质上,我们希望定期读取数据库,并使用新的元数据不断丰富事件

一种方法是将广播状态与每隔几分钟/小时读取DB的周期性源一起使用。广播此流并使用它加入。但问题可能是广播流的第一次读取可能比从卡夫卡流读取的某些消息要晚


有更好的方法吗?

您可以使用Flink SQL来实现这一点。根据具体的需求,您可以对MySQL数据库中的CDC流执行操作,也可以对MySQL执行操作(可能启用了)

另见

更新:

如果您希望使用DataStream API,但担心某些kafka消息可能在广播流中的相应数据可用之前被处理,您可以:

  • 在扩展函数的
    open()
    方法中,对MySQL执行初始查询以预加载元数据
  • 如果在进行连接时广播数据仍然不可用,请使用在
    打开()
    期间获取的数据,或使用硬连接到代码中的一些默认值

或者,您可以使用状态处理器API来引导广播状态的值。

Hey@David再次感谢,考虑到这个问题,这样的功能会非常好。我试图遍历代码,似乎StateDescriptor接受默认值,只是MapDescriptor没有公开它。如果我们现在重写类并公开默认值可以吗?抱歉,但我不理解你的问题。可以看出,David StateDescriptor可以接受默认值,因为状态可以设置。因此,在我的问题中,如果我能够为broadcastState设置默认值,那么我应该能够使Broadcast state解决方案也正常工作?为状态描述符提供默认值并不能做任何其他事情。当您需要广播状态的值时,可以检查它是否为null,并使用其他值。请参阅上面我的扩展答案。