首页 > 数据库 > 数据库开发技术 > 5种常见的Flink维表Join方案
一般来说维表分为静态维表和变化维表。对于静态维表比较好处理,初始化一次加载到内存即可。但现实情况一般维表是不定期更新的,那如何 JOIN 一张不断变化的表呢?所以本文就目前几种常见的维表join方案做一个总结。
这里总结一下几种维表join的思路,主要包括以下几种:
① 热存储关联
② 预加载维表
③ 广播维表
④ Temporal Table Join
⑤ Lookup Table Join
查找关联就是在主数据流中直接访问外部数据(mysql,redis,presto ...)根据关键条件去关联。
访问数据库时同步调用,这会导致子线程会被阻塞,影响吞吐量。
既然同步方式会造成资源阻塞,所以为了提升吞吐量,我们可以通过异步 I / O ,可以并发处理多个请求,很大程度上减少了对子线程的阻塞。具体使用方法可以参考 Flink 的 AsyncDataStream 使用说明。
不管是同步还是异步访问数据库,都会对外部数据库造成一定的压力。这时我们不妨考虑一下使用缓存来减轻外部存储的压力,比如 guava Cache 或者 Redis 等。
通过定义一个类实现RichMapFunction,在open()中读取维表数据加载到内存中,在主数据流map()方法中与维表数据进行关联。
RichMapFunction中open方法里加载维表数据到内存的方式特点如下:
优点:实现简单
缺点:因为数据存于内存,所以只适合小数据量并且维表数据更新频率不高的情况下。虽然可以在open中定义一个定时器定时更新维表,但是还是存在维表更新不及时的情况。
利用Flink的Broadcast State将维度数据流广播到下游做join操作。
优点:维度数据变更后可以即时更新到结果中。这种场景要求维表数据存在于实时流中。
缺点:数据保存在内存中,支持的维度数据量比较小。
时态表,是Flink针对维表关联的一个解决方案。Temporal table是持续变化表上某一时刻的视图,Temporal table function是一个表函数,传递一个时间参数,返回Temporal table这一指定时刻的视图。
优点:维度数据量可以很大,维度数据更新及时,要求维表数据存在于实时流中。 缺点:只支持在Flink SQL API中使用。
lookup join 其实简单理解来,就是每来一条数据去数据库中搂一次数据。然后把关联到的维度数据给拼接到当前数据中。
JDBC 连接器可以用在时态表关联中作为一个可 lookup 的 source (又称为维表)。用到的语法是 Temporal Joins 的语法。
优点:使用简单。
缺点:只支持在Flink SQL API中使用,且flink官方目前只支持Jdbc和Hbase的维表join。
选择哪种Join方案,取决于业务实际需求以及数据量的大小。当然了,如果有更好的想法,欢迎联系我一起探讨,在代码实现过程中有任何问题也可以随时联系作者。之后也会整理一份代码版的分享出来。
往期推荐
原文作者:毛毛小妖的笔记;如有侵权,请联系管理员删除。