社区中有好几个同学问过这样的场景:
flink 任务中,source 进来的数据,需要连接数据库里面的字段,再做后面的处理
这里假设一个 ETL 的场景,输入数据包含两个字段 “type, userid....” ,需要根据 type,连接一张 mysql 的配置表,关联 type 对应的具体内容。相对于输入数据的数量,type 的值是很少的(这里默认只有10种), 所以对应配置表就只有10条数据,配置是会定时修改的(比如跑批补充数据),配置的修改必须在一定时间内生效。
实时 ETL,需要用里面的一个字段去关联数据库,补充其他数据,进来的数据中关联字段是很单一的(就10个),对应数据库的数据也很少,如果用 异步 IO,感觉会比较傻(浪费资源、性能还不好)。同时数据库的数据是会不定时修改的,所以不能在启动的时候一次性加载。
Flink 现在对应这种场景可以使用 Boradcase state 做,如:基于Broadcast 状态的Flink Etl Demo
这里想说的是另一种更简单的方法: 使用定时器,定时加载数据库的数据(就是简单的Java定时器)
先说一下代码流程:
1、自定义的 source,输入逗号分隔的两个字段
2、使用 RichMapFunction 转换数据,在 open 中定义定时器,定时触发查询 mysql 的任务,并将结果放到一个 map 中
3、输入数据关联 map 的数据,然后输出
先看下数据库中的数据:
mysql> select *from timer;

本文介绍了如何在Flink中利用定时器定时从MySQL读取配置数据,以实现ETL过程。通过创建自定义Source并使用RichMapFunction,在open方法中设置定时器,每10秒查询数据库并将结果存入HashMap,以此实现数据的实时关联和处理。这种方法避免了频繁的异步IO操作,且能及时响应数据库的配置更新。
最低0.47元/天 解锁文章
1331

被折叠的 条评论
为什么被折叠?



