Flink关联维度数据
(TODO)
Driver预加载维度数据
- 实现方式:通过Distributed Cache分发本地维度文件到Task Manager后加载到内存关联。
- 优点:略
- 缺点:仅支持小数据量的维度,更新的维度数据需要重启作业才能被使用
- 适用场景:维度数据时文件形式、数据量小、更新频率极低
示例:
1 | env.registerCachedFile("file:///{路径}/product.txt", "product.txt") |
算子预加载维度数据
- 实现方式:自定义类并继承
RichFlatMapFunction,在open()方法中读取维度数据,将其全量加载到flatMap算子的内存。并且通过创建线程定时读取维度数据的方式,可以实现周期性更新内存中维度数据的功能。 - 优点:实现简单
- 缺点:仅支持小数据量的维度
- 适用场景:维度小且变更频率低,对变更及时性要求低
示例:
1 | class DimFlatMapFunction extends RichFlatMapFunction[(Int, String), (Int, String, String)] { |
关联热存储上的维度数据
- 实现方式:实时流与热存储上维度数据进行关联,并且在实时流端使用缓存技术来减轻对热存储的访问压力。具体的,将维度数据导入热存储(Redis/Tair/HBase/ES)通过异步IO查询热存储,实时流端使用缓存技术将维度数据缓存在内存
- 优点:维度数据不受限
Task Manager所分配的内存,能支持更多的维度数据 - 缺点:需要热存储资源,更新的维度反馈到结果有延迟(热存储导入以及有缓存带来的延迟)
- 适用场景:维度数据量较大,为接受维度更新有一定的延迟
广播维度数据
- 实现方式:将维度数据发送到Kafka作为要被广播的流,利用Broadcast State将维度数据流广播到下游Task进行Join;通过自定义Source的方式来实现维度数据流,也可以实现对多样的维度数据进行广播的效果
- 优点:维度的变更可以即时更新到结果
- 缺点:数据保存在内存中,支持的维度数据量较小
- 适用场景:需要实时感知维度变更,维度数据可转换为实时流
示例:
1 | // 订单流:(pid, 时间戳) |
参考
- https://www.bilibili.com/video/BV1q7411N75R
- https://flink.apache.org/2019/06/26/broadcast-state.html(中文篇https://developer.aliyun.com/article/706760)
- https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/datastream/fault-tolerance/broadcast_state/
- https://ci.apache.org/projects/flink/flink-docs-master/zh/docs/dev/table/sourcessinks/#runtime-1
- https://ci.apache.org/projects/flink/flink-docs-master/zh/docs/dev/datastream/operators/asyncio/