ITPub博客

首页 > 数据库 > 数据库开发技术 > 5种常见的Flink维表Join方案

5种常见的Flink维表Join方案

原创 数据库开发技术 作者:毛毛小妖的笔记 时间:2024-01-11 22:42:13 0 删除 编辑

一般来说维表分为静态维表和变化维表。对于静态维表比较好处理,初始化一次加载到内存即可。但现实情况一般维表是不定期更新的,那如何 JOIN 一张不断变化的表呢?所以本文就目前几种常见的维表join方案做一个总结。

写在前面

这里总结一下几种维表join的思路,主要包括以下几种:

① 热存储关联

② 预加载维表

③ 广播维表

④ Temporal Table Join

⑤ Lookup Table Join

热存储关联

查找关联就是在主数据流中直接访问外部数据(mysql,redis,presto ...)根据关键条件去关联。

1. 使用同步join

访问数据库时同步调用,这会导致子线程会被阻塞,影响吞吐量。

2. 使用异步join

既然同步方式会造成资源阻塞,所以为了提升吞吐量,我们可以通过异步 I / O ,可以并发处理多个请求,很大程度上减少了对子线程的阻塞。具体使用方法可以参考 Flink 的 AsyncDataStream 使用说明。

3. 使用缓存

不管是同步还是异步访问数据库,都会对外部数据库造成一定的压力。这时我们不妨考虑一下使用缓存来减轻外部存储的压力,比如 guava Cache 或者 Redis 等。

预加载维表

通过定义一个类实现RichMapFunction,在open()中读取维表数据加载到内存中,在主数据流map()方法中与维表数据进行关联。

RichMapFunction中open方法里加载维表数据到内存的方式特点如下:

优点:实现简单

缺点:因为数据存于内存,所以只适合小数据量并且维表数据更新频率不高的情况下。虽然可以在open中定义一个定时器定时更新维表,但是还是存在维表更新不及时的情况。

广播维表

利用Flink的Broadcast State将维度数据流广播到下游做join操作。

优点:维度数据变更后可以即时更新到结果中。这种场景要求维表数据存在于实时流中。

缺点:数据保存在内存中,支持的维度数据量比较小。

Temporal Table Join

时态表,是Flink针对维表关联的一个解决方案。Temporal table是持续变化表上某一时刻的视图,Temporal table function是一个表函数,传递一个时间参数,返回Temporal table这一指定时刻的视图。

优点:维度数据量可以很大,维度数据更新及时,要求维表数据存在于实时流中。 缺点:只支持在Flink SQL API中使用。

Lookup Table Join

lookup join 其实简单理解来,就是每来一条数据去数据库中搂一次数据。然后把关联到的维度数据给拼接到当前数据中。

JDBC 连接器可以用在时态表关联中作为一个可 lookup 的 source (又称为维表)。用到的语法是 Temporal Joins 的语法。

优点:使用简单。

缺点:只支持在Flink SQL API中使用,且flink官方目前只支持Jdbc和Hbase的维表join。

写在最后

选择哪种Join方案,取决于业务实际需求以及数据量的大小。当然了,如果有更好的想法,欢迎联系我一起探讨,在代码实现过程中有任何问题也可以随时联系作者。之后也会整理一份代码版的分享出来。


往期推荐

大数据学习指南(第七节):Kafka技术(上)

大数据学习指南(第六节):Zookeeper技术

大数据学习指南(第五节):Hadoop技术之YARN(续)

大数据学习指南(第四节):Hadoop技术之YARN

大数据学习指南(第三节):Hadoop技术之HDFS

大数据学习指南(第二节):Hadoop介绍及环境搭建

大数据学习指南(第一节):大数据概论

原文作者:毛毛小妖的笔记;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-04-04

  • 博文量
    70
  • 访问量
    46581