社区中有好几个同学问过这样的场景:
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;