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

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.lryc.cn/news/618456.html

相关文章:

  • nvm install 14.21.3 时npm 无法下载和识别
  • code-inspector-plugin插件
  • npm、pnpm、yarn区别
  • 【Linux系统】详解Ext2,文件系统
  • RabbitMQ-知识技能图谱(总结篇)
  • 智能家居Agent:物联网设备的统一控制与管理
  • 算法打卡力扣第88题:合并两个有序数组(easy)
  • 第五章 树与二叉树
  • 虚拟机高级玩法-网页也能运行虚拟机——WebAssembly
  • Day24|学习前端CSS
  • AI入门学习--AI模型评测
  • Java集合学习之forEach()遍历方法的底层原理
  • 深度解读 WizTelemetry 2.0:链路追踪如何让分布式系统“无所遁形”
  • 【2025最新版】Java基础知识学习路线图:从入门到精通的系统化指南
  • 深度贴:前端网络基础及进阶(2)
  • 【网络运维】Linux和自动化: Ansible基础实践
  • 【接口自动化】-11-接口加密签名 全局设置封装
  • 回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测
  • 如何使用gpt进行模型微调?
  • iceberg FlinkSQL 特性
  • 古风修仙主题登录页面设计与实现 附源码 ~~~
  • Iptables 详细使用指南
  • 【CSS3】录音中。。。
  • 飞算JavaAI 2.0.0深度测评:自然语言编程如何重塑Java开发范式
  • 基于 gRPC 的接口设计、性能优化与生产实践
  • 《软件工程导论》实验报告一 软件工程文档
  • 新手向:Python编写简易翻译工具
  • Jmeter性能测试过程中遇到connection reset的解决方案
  • 易语言模拟真人鼠标轨迹算法 - 非贝塞尔曲线
  • HTTP应用层协议-长连接