Flink维表Join方式?
1. 直接加到内存,起一个线程定时更新维表。
# 优点:实现简单
# 缺点:适用于维表不是太大,维度更新不频繁场景
# 适用场景:维表小,变更频率低,对变更及时性要求低
2. 通过Distributed Cache 分发本地维度文件到task manager后加载到内存关联。
* 通过env.registerCachedFile注册文件。实现RichFunction,在open()中通过RuntimeContext获取cache文件。
# 优点:不需要外部数据库
# 缺点:支持维度数据量比较小,更新需要更改文件并重启作业
# 适用场景:维度数据是以文件形式,数据量小,更新频率低。
比如:静态码表,配置文件。
3. 热存储关联:利用Flink的RichAsyncFunction读取外部存储的数据到缓存中,我们在关联维度表时先去查询缓存,如果缓存中不存在这条数据,就利用客户端去查询外部存储,然后插入到缓存中, 可以使用 Guava 库提供的 CacheBuilder 来创建缓存。
外部存储可以是HBase,Redis等
* 这里需要特别注意的是,我们用到了异步 IO (RichAsyncFunction),这个功能的出现就是为了解决与外部系统交互时网络延迟成为系统瓶颈的问题。
# 优点:维度数据不受限于内存,支持较多维度数据
# 缺点:需要热存储资源,维度更新反馈到结果有延迟(热存储导入,cache) # 适用场景:维度数据量大,可接受维度更新有一定的延迟。
4. Broadcast 流 1. 将维度数据发送到Kafka作为流S1。事实数据是流S2。
2. 定义状态描述符MapStateDescriptor,如descriptor。
3. 结合状态描述符,将S1广播出去,如S1.broadcast(descriptor),形成广播流(BroadcastStream) B1。
4. 事实流S2和广播流B1连接,形成连接后的流BroadcastConnectedStream BC。
5. 基于BC流,在KeyedBroadcastProcessFunction/BroadcastProcessFunction中实现Join的逻辑处理。
# 优点: 维度变化实时感知
# 缺点: 需要将维度变化数据转换为Kafka流,维度数据保存在内存中,支持的数据量相对较小
# 使用场景: 维度数据量小,维度变化敏感
5. Flink SQL 实现维表Join