Flink中多表进行join的话,有哪些解决方案?

提问者:帅平 问题分类:面试刷题
Flink中多表进行join的话,有哪些解决方案?
5 个回答
青山依旧
青山依旧
Lookup Join:Lookup Join 通常用于通过连接外部表(维度表)进行关联,要求一个表具有处理时间属性,另一个表使 Lookup Source Connector。
优点:实现方便
缺点:需要维护关联数据状态,可能会占用较大空间. 并行度取决于关联数据源的并行度
发布于:3个月前 (02-06) IP属地:四川省
旧梦难醒
旧梦难醒
广播维表:基础流程如下
1、通过数据同步工具将缓慢变化的维度数据发送到Kafka作为流S1。事实数据是流S2。
2、定义状态描述符MapStateDescriptor,如descriptor。
3、结合状态描述符,将S1广播出去,如S1.broadcast(descriptor),形成广播流(BroadcastStream) B1。
4、事实流S2和广播流B1连接,形成连接后的流BroadcastConnectedStream BC。
5、基于BC流,在KeyedBroadcastProcessFunction/BroadcastProcessFunction中实现Join的逻辑处理。
对应优缺点如下:
优点:维度数据变更后可以即时更新到结果中。
缺点:数据保存在内存中,支持的维度数据量比较小。​​
发布于:3个月前 (02-06) IP属地:四川省
满天都是派星べ
满天都是派星べ
热存储维表:这种方式是将维表数据存储在Redis、HBase、MySQL等外部存储中,实时流在关联维表数据的时候实时去外部存储中查询,实现的方式有同步和异步两种.
优点:维度数据量不受内存限制,可以存储很大的数据量。
缺点:因为维表数据在外部存储中,读取速度受制于外部存储的读取速度;另外维表的同步也有延迟。
优化点:缓存、 异步IO功能
发布于:3个月前 (02-06) IP属地:四川省
浮°
浮°
状态编程, 预加载数据到状态中:首先把维表数据初始化到state中, 然后通过注册Timer的方式, 主动加载和更新维度值。
优点:自己维护状态数据, 不需要频繁操作外部数据源. 
缺点:不适合大的维表和变化大的维表。
发布于:3个月前 (02-06) IP属地:四川省
曾经多难忘
曾经多难忘
预加载维表信息:通过定义一个类实现RichMapFunction,在open()中读取维表数据加载到内存中,在probe流map()方法中与维表数据进行关联。
RichMapFunction中open方法里加载维表数据到内存的方式特点如下:
优点:实现简单.
缺点:因为数据存于内存,所以只适合小数据量并且维表数据更新频率不高的情况下。虽然可以在open中定义一个定时器定时更新维表,但是还是存在维表更新不及时的情况。
发布于:3个月前 (02-06) IP属地:四川省
我来回答