当前位置: 首页 > ai >正文

Flink Redis维表:Broadcast Join与Lookup Join对比及SQL示例

Flink Redis维表:Broadcast Join与Lookup Join对比及SQL示例

  • Flink Redis维表:Broadcast Join与Lookup Join对比及SQL示例
    • 一、核心概念与原理
      • 1.1 Broadcast Join(广播连接)
      • 1.2 Lookup Join(查找连接)
    • 二、关键区别对比
    • 三、SQL Demo(基于Flink 1.15+)
      • 3.1 Broadcast Join 示例(Redis风控规则维表)
        • 步骤1:定义Redis维表(广播源)
        • 步骤2:定义动账数据流
        • 步骤3:广播连接计算
      • 3.2 Lookup Join 示例(Redis大维表)
        • 步骤1:定义Redis维表(Lookup模式)
        • 步骤2:定义交易流
        • 步骤3:Lookup连接计算
    • 四、总结

Flink Redis维表:Broadcast Join与Lookup Join对比及SQL示例

在Flink流处理中,维表关联是常见需求(如风控场景中关联Redis存储的风控规则)。针对Redis维表,常用方案有Broadcast Join(广播连接)和Lookup Join(查找连接),本文从原理、适用场景、性能差异展开对比,并提供SQL Demo。


一、核心概念与原理

1.1 Broadcast Join(广播连接)

核心逻辑:将小维度表(如Redis中的风控规则)广播到所有并行任务,各任务本地维护一份维表副本(通过Broadcast State),数据流与本地维表直接关联。
Redis集成:先从Redis加载全量表到内存,再通过Flink的Broadcast Stream广播到所有并行实例。

1.2 Lookup Join(查找连接)

核心逻辑:数据流处理时,实时查询外部Redis维表(如通过Async I/O),每次关联操作触发一次Redis查询。
Redis集成:定义Redis维表为Lookup Table,Flink运行时动态调用Redis客户端查询。


二、关键区别对比

维度Broadcast JoinLookup Join
适用数据量小维表(通常<1GB)大维表(支持GB级以上)
更新实时性需手动触发广播更新(如Redis数据变更后重新广播)自动感知Redis变更(查询时获取最新值)
资源消耗内存占用高(全表复制到所有并行任务)内存占用低(仅缓存少量热点数据)
查询延迟低(本地内存访问)较高(网络IO到Redis)
容错复杂度高(需 checkpoint 广播状态)低(依赖Redis持久化,无需 checkpoint 维表)

三、SQL Demo(基于Flink 1.15+)

3.1 Broadcast Join 示例(Redis风控规则维表)

假设Redis存储风控规则(Hash类型,Key为rule_id,Field为threshold),需关联动账数据流(Kafka主题account_tran)。

步骤1:定义Redis维表(广播源)
-- 从Redis加载全量规则(需自定义Source)
CREATE TEMPORARY TABLE redis_rule_broadcast (rule_id STRING,threshold INT
) WITH ('connector' = 'redis','mode' = 'broadcast', -- 标记为广播模式'host' = 'redis-host','port' = '6379','database' = '0'
);
步骤2:定义动账数据流
CREATE TEMPORARY TABLE account_tran (tran_id STRING,amount INT,event_time TIMESTAMP_LTZ(3),WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH ('connector' = 'kafka','topic' = 'account_tran','properties.bootstrap.servers' = 'kafka-host:9092','format' = 'json'
);
步骤3:广播连接计算
-- 将规则广播流与数据流关联
SELECT t.tran_id, t.amount, r.threshold
FROM account_tran AS t
LEFT JOIN redis_rule_broadcast FOR SYSTEM_TIME AS OF t.event_time AS r
ON t.rule_id = r.rule_id;

3.2 Lookup Join 示例(Redis大维表)

假设Redis存储商户信息(Hash类型,Key为merchant_id,Field为risk_level),需关联实时交易流。

步骤1:定义Redis维表(Lookup模式)
CREATE TEMPORARY TABLE redis_merchant_lookup (merchant_id STRING,risk_level STRING
) WITH ('connector' = 'redis','mode' = 'lookup', -- 标记为Lookup模式'host' = 'redis-host','port' = '6379','database' = '1','lookup.cache-type' = 'lru', -- 开启LRU缓存(减少Redis压力)'lookup.cache-size' = '10000'
);
步骤2:定义交易流
CREATE TEMPORARY TABLE transaction_stream (order_id STRING,merchant_id STRING,event_time TIMESTAMP_LTZ(3),WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH ('connector' = 'kafka','topic' = 'transaction_topic','properties.bootstrap.servers' = 'kafka-host:9092','format' = 'json'
);
步骤3:Lookup连接计算
-- 实时查询Redis维表
SELECT s.order_id, s.merchant_id, l.risk_level
FROM transaction_stream AS s
LEFT JOIN redis_merchant_lookup FOR SYSTEM_TIME AS OF s.event_time AS l
ON s.merchant_id = l.merchant_id;

四、总结

  • 选Broadcast Join:维表小、更新不频繁、需低延迟(如风控规则)。
  • 选Lookup Join:维表大、更新频繁、内存受限(如商户信息)。
    实际生产中,可结合Broadcast State+Redis混合模式:热点规则广播,非热点规则Lookup,平衡性能与资源。
http://www.xdnf.cn/news/17570.html

相关文章:

  • 从零部署Nacos:替代Eureka的服务注册与服务发现基础教程
  • 使用Excel制作甘特图
  • 无人机三维路径规划
  • Python科学计算与可视化领域工具TVTK、Mayavi、Mlab、Traits(附视频教程)
  • 【PyTorch学习笔记 - 02】 Datasets DataLoaders
  • 白板功能文档
  • 物联网、大数据与云计算持续发展,楼宇自控系统应用日益广泛
  • 在达梦数据库中使用group by 命令报错问题
  • uniapp常用组件
  • OpenBMC中C++单例模式架构与实现全解析
  • PySpark性能优化与多语言选型讨论
  • 13-docker的轻量级私有仓库之docker-registry
  • golang 基础案例_02
  • 使用Pytest进行接口自动化测试(三)
  • Docker-09.Docker基础-Dockerfile语法
  • Selenium元素定位不到原因以及怎么办?
  • K8S学习----应用部署架构:传统、虚拟化与容器的演进与对比
  • 计算机网络(一)——TCP
  • monorepo架构设计方案
  • LCR 120. 寻找文件副本
  • 【bug】diff-gaussian-rasterization Windows下编译 bug 解决
  • Redis 数据倾斜
  • 腾讯前端面试模拟详解
  • 从零构建自定义Spring Boot Starter:打造你的专属开箱即用组件
  • 【linux】企业高性能web服务器
  • Horse3D引擎研发笔记(四):在QtOpenGL下仿three.js,封装EBO绘制四边形
  • HarmonyOS 开发入门 第一章
  • AI驱动的智能编码革命:从Copilot到全流程开发自动化
  • LAMPLNMP 最佳实践
  • 基于FPGA的热电偶测温数据采集系统,替代NI的产品(二)总体设计方案