如何从零开始实战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 中准备一张简单的用户维度表,用来存用户的基础属性。
阅读全文