大家好,初学flink,版本1.8.1。想请教一个思路问题:在物联网系统中会实时处理一些设备上来的状态数据,但是设备元数据信息或者基础数据会存储在类似MySQL数据库中,当实时流数据上来的时候需要这些基础数据进行计算。但是因为性能问题,不能实时的去数据库获取,所以需要在系统启动的时候缓存起来,然后再开始收数据或者开始处理数据。数据来源kafka。
请教2个问题: 1. 有什么方式能否保证数据开始处理的时候,基础数据已经缓存好了,可以在流处理中获取到(类似valueState),算子的open函数似乎不能写到valueState里面去,只能初始化state。 2. 当基础数据在数据库中有变化的时候,如何实时的通知到处理流中,更新缓存?(广播流?) 谢谢。 [hidden email] |
你好,可以考虑在open方法里启动一个定时的线程去取mysql里去数据和进行缓存更新。
当有新数据流入到你的系统中时,可以判断定时线程数据加载是否完成,当数据加载完成后再进行数据处理。 希望能有帮助~ Best, Terry Wang > 在 2019年9月24日,上午10:45,[hidden email] 写道: > > 大家好,初学flink,版本1.8.1。想请教一个思路问题:在物联网系统中会实时处理一些设备上来的状态数据,但是设备元数据信息或者基础数据会存储在类似MySQL数据库中,当实时流数据上来的时候需要这些基础数据进行计算。但是因为性能问题,不能实时的去数据库获取,所以需要在系统启动的时候缓存起来,然后再开始收数据或者开始处理数据。数据来源kafka。 > 请教2个问题: > > 1. 有什么方式能否保证数据开始处理的时候,基础数据已经缓存好了,可以在流处理中获取到(类似valueState),算子的open函数似乎不能写到valueState里面去,只能初始化state。 > 2. 当基础数据在数据库中有变化的时候,如何实时的通知到处理流中,更新缓存?(广播流?) > > 谢谢。 > > > > [hidden email] |
In reply to this post by haoxinyue@163.com
你好,
我这里提供几个思路,我们公司做车联网的,目前线上运行的程序,都需要处理你说的这些场景。 1. 有什么方式能否保证数据开始处理的时候,基础数据已经缓存好了,可以在流处理中获取到(类似valueState),算子的open函数似乎不能写到valueState里面去,只能初始化state。 目前我们需要使用的外部缓存数据,包含需要调用接口的,需要读取数据库的基础数据。 针对调用接口,我们使用的guava的异步缓存刷新策略 针对数据库中的基础数据,我们类似懒加载,当第一条数据过来的时候,我们会锁住流,等待所有的数据都读取完了,整个流才继续执行。 2. 当基础数据在数据库中有变化的时候,如何实时的通知到处理流中,更新缓存?(广播流?) 针对基础数据的刷新,可以分两个阶段来做。 阶段一,可以启动一个定时刷新的线程,定时增量从数据库中读取数据来刷新缓存中的数据就OK。 阶段二,可以基于canal+kafka+广播来做。简单来说,就是用canal监听数据库的变换,然后推送到kafka中,你的流中消费这个kafka topic,然后获取到基础数据后,通过广播的形式来传递到各个算子。 另外,社区里有人使用的是流表与维表join的方式来做的,维表就是基础数据,维表的加载和刷新都是通过异步算子来实现的。具体的,你可以搜一下。 感觉这个更符合Flink的体系。我前面提到的,其实在java程序和在Flink中都会这么处理。 [hidden email] <[hidden email]> 于2019年9月24日周二 上午10:45写道: > > 大家好,初学flink,版本1.8.1。想请教一个思路问题:在物联网系统中会实时处理一些设备上来的状态数据,但是设备元数据信息或者基础数据会存储在类似MySQL数据库中,当实时流数据上来的时候需要这些基础数据进行计算。但是因为性能问题,不能实时的去数据库获取,所以需要在系统启动的时候缓存起来,然后再开始收数据或者开始处理数据。数据来源kafka。 > 请教2个问题: > > 1. > 有什么方式能否保证数据开始处理的时候,基础数据已经缓存好了,可以在流处理中获取到(类似valueState),算子的open函数似乎不能写到valueState里面去,只能初始化state。 > 2. 当基础数据在数据库中有变化的时候,如何实时的通知到处理流中,更新缓存?(广播流?) > > 谢谢。 > > > > [hidden email] > |
非常感谢,大家同行。
我们目前是确实按照类似你说的这些方式去完成的。但是我们始终觉得应该有更加flink的方式优雅完成,就像维表join。之前一直没有细看,谢谢提醒。 [hidden email] 发件人: 高博 发送时间: 2019-09-24 16:03 收件人: user-zh 主题: Re: 请教初始化系统缓存的问题 你好, 我这里提供几个思路,我们公司做车联网的,目前线上运行的程序,都需要处理你说的这些场景。 1. 有什么方式能否保证数据开始处理的时候,基础数据已经缓存好了,可以在流处理中获取到(类似valueState),算子的open函数似乎不能写到valueState里面去,只能初始化state。 目前我们需要使用的外部缓存数据,包含需要调用接口的,需要读取数据库的基础数据。 针对调用接口,我们使用的guava的异步缓存刷新策略 针对数据库中的基础数据,我们类似懒加载,当第一条数据过来的时候,我们会锁住流,等待所有的数据都读取完了,整个流才继续执行。 2. 当基础数据在数据库中有变化的时候,如何实时的通知到处理流中,更新缓存?(广播流?) 针对基础数据的刷新,可以分两个阶段来做。 阶段一,可以启动一个定时刷新的线程,定时增量从数据库中读取数据来刷新缓存中的数据就OK。 阶段二,可以基于canal+kafka+广播来做。简单来说,就是用canal监听数据库的变换,然后推送到kafka中,你的流中消费这个kafka topic,然后获取到基础数据后,通过广播的形式来传递到各个算子。 另外,社区里有人使用的是流表与维表join的方式来做的,维表就是基础数据,维表的加载和刷新都是通过异步算子来实现的。具体的,你可以搜一下。 感觉这个更符合Flink的体系。我前面提到的,其实在java程序和在Flink中都会这么处理。 [hidden email] <[hidden email]> 于2019年9月24日周二 上午10:45写道: > > 大家好,初学flink,版本1.8.1。想请教一个思路问题:在物联网系统中会实时处理一些设备上来的状态数据,但是设备元数据信息或者基础数据会存储在类似MySQL数据库中,当实时流数据上来的时候需要这些基础数据进行计算。但是因为性能问题,不能实时的去数据库获取,所以需要在系统启动的时候缓存起来,然后再开始收数据或者开始处理数据。数据来源kafka。 > 请教2个问题: > > 1. > 有什么方式能否保证数据开始处理的时候,基础数据已经缓存好了,可以在流处理中获取到(类似valueState),算子的open函数似乎不能写到valueState里面去,只能初始化state。 > 2. 当基础数据在数据库中有变化的时候,如何实时的通知到处理流中,更新缓存?(广播流?) > > 谢谢。 > > > > [hidden email] > |
Free forum by Nabble | Edit this page |