如何从零开始实战Flink实现实时数仓与维表时态Join?
摘要:以电商订单实时数仓为例,演示如何在 Flink SQL 中通过维表时态 Join 将事实流与维度数据关联,构建带用户属性的明细宽表,并结合 Kafka 与 MySQL 环境完成一套可落地的实时数仓入门实践。
在前一篇 《Flink 双流 JOIN 实战详解》 中,我们用「订单流 + 支付流」搞懂了事实双流之间的时间关联。
但在真实的实时数仓项目里,光有事实流还不够,业务同学更关心的是:
下单用户是新客还是老客
用户当前的等级、城市、渠道
商品所属品类、类目层级
这些信息通常存放在 维度表(维表)中,例如 MySQL 的 dim_user、dim_product 等。我们希望在实时计算时,能把「事实流」和「维表」在时间维度上正确地关联起来,构建一张带有完整业务属性的明细宽表。
这就是 维表时态 Join(Temporal Table Join) 要解决的问题。
本文我们就以「订单事实流 + 用户维表」为例,完成一个从 Kafka 到 MySQL 的简易实时数仓 Demo,并重点理解 Flink SQL 中维表时态 Join 的语法和注意事项。
一、业务场景与数仓目标
设想一个简化的电商业务场景:
Kafka 中有实时写入的 orders 订单事实流
MySQL 中维护一张 dim_user 用户维表,包含用户等级、所属城市、注册渠道等信息
我们想要在 Flink 中构建一张「订单明细宽表」,字段大致包括:
订单信息:订单号、下单用户、下单金额、下单时间
用户属性:用户昵称、等级、城市、注册渠道
并且要求:
当我们回看 10 分钟前的某条订单时,看到的是 当时 用户的等级和城市,而不是被后续变更“冲掉”的最新值
这正是 时态 Join 和「实时数仓」的关键:按事件发生时刻回放维度视图。
二、环境前提与依赖准备
1. 基础组件
本篇默认你已经完成前几篇中的环境准备:
Flink 1.20.1(WSL2 Ubuntu 下部署)
Kafka 集群已启动,且能正常写入 / 读取 Topic
Flink SQL Client 可以正常连接集群
在此基础上,我们还需要:
一套可访问的 MySQL(本地或远程均可)
Flink 的 JDBC Connector JAR 包
2. 安装 Flink JDBC Connector
和 Kafka 一样,JDBC 连接器也需要以 JAR 包形式放到 Flink 的 lib 目录中。
以 Flink 1.20.x 对应的 flink-connector-jdbc 为例:
确认 Flink 安装目录(假设为 /opt/flink):
export FLINK_HOME=/opt/flink
下载 JDBC Connector JAR 到 Flink 的 lib 目录:
cd $FLINK_HOME/lib
wget https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc/3.3.0-1.20/flink-connector-jdbc-3.3.0-1.20.jar
如果你使用的是独立集群或远程集群,需要重启 Flink 集群,让新 JAR 在 JobManager/TaskManager 上生效:
cd $FLINK_HOME
bin/stop-cluster.sh
bin/start-cluster.sh
重启 Flink SQL Client,使用新 Connector:
cd $FLINK_HOME
bin/sql-client.sh
如果你在 Windows + WSL2 上部署,只需在 WSL2 内执行上述命令即可;或者手动下载 JAR 后拷贝到 lib 目录,步骤完全一致。
三、准备 MySQL 用户维度表 dim_user
首先在 MySQL 中准备一张简单的用户维度表,用来存用户的基础属性。
