基于flink维表join优化浅述

Flink 实时计算 - 维表 Join 解读 Flink 实时计算 - 维表 Join 解读 前言 Flink 1.9 版本可以说是一个具有里程碑意义的版本,其内部合入了很多 Blink Table/SQL 方面的功能,同时也开始增强 Flink 在批处理方面的能力,真的是向批流统一的终极方向开始前进。Flink 1.9 版本在 8.22 号也终于发布了。本文主要介绍学习 Flink SQL 维表 Join,维表 Join 对于SQL 任务来说,一般是一个很正常的功能,本文给出代码层面的实现,和大家分享用户如何自定义 Flink 维表。 1. 什么是维 阅读详情

一、维表join基础操作

      在实际工作场景中,数据流处理往往需要与相关的维度数据进行关联操作。根据不同的业务场景和需求,合理选择相应的缓存策略至关重要,以确保数据处理的效率和准确性。

通用缓存策略详解

        在使用维表 Join 时,大部分连接器都支持缓存策略,但不同连接器对缓存策略的支持情况可能略有不同。因此,在使用缓存策略之前,请务必查阅对应连接器的官方文档,以确定具体的支持情况。以下是通用的缓存策略及其详细说明:

1. None(默认值):无缓存

描述:不使用任何缓存机制,每次查询都直接从物理维表中获取数据。

使用场景:

  • 对数据准确性要求极高,无法容忍任何数据延迟或不准确的情况。

  • 维表数据更新频繁,实时性要求高。

优点:

  • 数据实时性强,能够保证查询结果的准确性。

缺点:

  • 当数据量较大时,Join 操作的性能压力会显著增加,容易导致反压。

  • 对维表数据库的查询压力较大,可能影响数据库性能。

2. LRU(Least Recently Used):缓存部分数据

描述:缓存维表中的部分数据。系统会根据最近使用情况维护一个缓存,源表的每条数据都会先在缓存中查找,如果未找到,则从物理维表中查询。

使用场景:

  • 维表数据更新频率较低,可以容忍少量数据不准确的情况。

  • 对查询性能有一定要求,但对数据实时性要求不高。

优点:

  • 提高 Join 操作的性能,减少对物理维表的查询次数。

  • 缓存机制可以有效缓解数据库的压力。

缺点:

  • 当维表数据发生变化时,缓存中的部分数据可能会变得不准确。

  • 缓存大小有限,可能导致部分数据无法被缓存。

3. ALL:缓存全部数据

描述:缓存维表中的所有数据。在作业运行前,系统会将维表中的所有数据加载到缓存中,之后所有的维表查找操作都会通过缓存进行。如果在缓存中未找到数据,则认为该键不存在。全量缓存有一个过期时间,过期后会重新加载全量缓存。

使用场景:

  • 适用于远程表数据量较小,且源表数据与维表 JOIN 时,ON 条件无法关联(MISS KEY)的情况较多。

  • 对查询性能要求极高,且可以接受全量数据加载的延迟。

优点:

  • 提供最高的查询性能,因为所有数据都在缓存中。

  • 减少了对物理维表的查询,降低了数据库的压力。

缺点:

  • 缓存占用内存较大,可能需要较多的资源。

  • 数据更新后,需要等待缓存过期或手动刷新缓存,可能存在短暂的数据不一致。

        目前维表关联伪代码如下:

--数据源
CREATE TEMPORARY TABLE tmp (
    driver_id bigint,
    lng double precision,
    lat double precision,
    speed double precision,
    proctime as PROCTIME()
) 
WITH (
    'connector' = 'mysql', --连接器的标示
    'dbname' = '',
    'tablename' = '',
    'username' = '',
    'password' = '',
    'endpoint' = ''
);

--维表
CREATE TEMPORARY TABLE dim_tmp (
    driver_id bigint,
    driver_value VARCHAR,
    PRIMARY KEY(driver_id) not ENFORCED 
) 
WITH (
    'connector' = 'redis',
    'host' = '',
    'port' = '6379',
    'password' = '', 
    'cache' = 'LRU', --缓存
    'cacheSize' = '100000',--缓存数据量
    'cacheTTLMs' = '0',--时效
    'dbNum' = '4'    
);

--维表join 
select
t.driver_id
,t2.driver_value
FROM tmp t1 
LEFT JOIN dim_tmp FOR SYSTEM_TIME AS OF t1.proctime AS t2
  ON  t1.driver_id = t2.driver_id 

二、维表join 策略

Lookup Hints

场景策略

配置'shuffle' = 'true'选项

使用引擎默认的shuffle策略。

不配置'shuffle' = 'true'选项,且维表连接器不提供自定义联接策略

配置'shuffle' = 'true' 选项,且维表连接器不提供自定义联接策略

默认使用SHUFFLE_HASH策略

配置'shuffle' = 'true' 选项,且维表连接器提供自定义联接策略

使用表连接器的自定义shuffle策略。

对维表配置联接时的shuffle策略代码示例如下:

--维表join 
select /*+ LOOKUP('table'='t2', 'shuffle' = 'true'),LOOKUP('table'='t3', 'shuffle' = 'true') */
t.driver_id
,t2.driver_value
FROM tmp t1 
LEFT JOIN dim_tmp FOR SYSTEM_TIME AS OF t1.proctime AS t2
  ON  t1.driver_id = t2.driver_id 
LEFT JOIN dim_tmp_1 FOR SYSTEM_TIME AS OF t1.proctime AS t3
    ON  t1.driver_id = t3.driver_id 

其他Join Hints

        维表Join Hints仅用于配置维表联接策略,包括SHUFFLE_HASH、REPLICATED_SHUFFLE_HASH和SKEW。维表Cache策略和联接策略之间的适用场景详情如下表所示。

Cache策略

SHUFFLE_HASH

REPLICATED_SHUFFLE_HASH

(和SKEW等价)

None

不建议使用该联接策略提示,主流会引入额外的网络开销。

不建议使用该联接策略提示,主流会引入额外的网络开销。

LRU

在维表查找IO成为瓶颈时,建议考虑使用该联接策略提示。当主流数据在Join Key上有时间局部性时,可以提高Cache命中率,减少IO请求数,从而提升总吞吐。

重要

主流会引入额外的网络开销,当主流数据在Join Key上有倾斜,遇到性能瓶颈时,建议考虑REPLICATED_SHUFFLE_HASH。

在维表查找IO成为瓶颈且主流数据在Join Key上有倾斜时,建议考虑该联接策略提示。当主流数据在Join Key上有时间局部性时,可以提高Cache命中率,减少IO请求数,从而提升总吞吐。

ALL

在维表内存使用量成为瓶颈时,建议使用该联接策略提示。内存使用率可降低为1/并发度。

重要

主流会引入额外的网络开销,当主流数据在Join Key上有倾斜,遇到性能瓶颈时,建议考虑REPLICATED_SHUFFLE_HASH。

在维表内存使用量成为瓶颈且主流数据在Join Key上有倾斜时,建议使用该联接策略提示。内存使用率降低为分桶数/并发度。

SHUFFLE_HASH
  • 使用效果

    在维表Join中使用Shuffle Hash策略,可以将主流数据在Join之前根据Join Key做一次shuffle。在使用LRU Cache策略时可以提高Cache命中率,减少IO请求数;在使用ALL Cache策略时可以减少内存使用量。每个SHUFFLE_HASH联接提示可指定多张维表。

  • 使用限制

    虽然SHUFFLE_HASH可以减少内存开销,但是由于上游数据需要按照Join Key做一次shuffle,引入额外的网络开销,因此下面两种场景不适合使用SHUFFLE_HASH联接策略。

    • 主流数据在Join Key上存在严重的数据倾斜,这种场景下如果使用SHUFFLE_HASH联接,会因为数据倾斜导致Join节点成为性能瓶颈,从而会导致流作业出现严重反压或是批场景出现严重长尾,此时建议使用REPLICATED_SHUFFLE_HASH联接。

    • 维表数据较小,ALL Cache策略加载没有内存瓶颈时,如果使用SHUFFLE_HASH联接,节约的内存开销和额外引入的网络开销相比,可能并不划算。

代码示例:

--维表join 
select /*+ SHUFFLE_HASH(t2, t3) */ 
t.driver_id
,t2.driver_value
FROM tmp t1 
LEFT JOIN dim_tmp FOR SYSTEM_TIME AS OF t1.proctime AS t2
  ON  t1.driver_id = t2.driver_id 
LEFT JOIN dim_tmp_1 FOR SYSTEM_TIME AS OF t1.proctime AS t3
    ON  t1.driver_id = t3.driver_id 
REPLICATED_SHUFFLE_HASH

  • 使用效果

    在维表Join中使用Replicated Shuffle Hash策略,其效果基本与SHUFFLE_HASH一致,但不同点是其会将主流具有相同key的数据随机打散到指定的N个并发上,可以解决数据倾斜导致的性能瓶颈。每个REPLICATED_SHUFFLE_HASH联接提示中可指定多张维表。

  • 使用限制

    • 需要配置倾斜数据分桶数量参数table.exec.skew-join.replicate-num,其默认值为16,取值不能大于维表联接节点的并发。

    • 当前不支持更新流,当主流是更新流时,使用REPLICATED_SHUFFLE_HASH策略会报错。

代码示例:

--维表join 
select /*+ REPLICATED_SHUFFLE_HASH(t2) */ 
t.driver_id
,t2.driver_value
FROM tmp t1 
LEFT JOIN dim_tmp FOR SYSTEM_TIME AS OF t1.proctime AS t2
  ON  t1.driver_id = t2.driver_id 
SKEW
  • 使用效果

    当指定表存在数据倾斜时,优化器会在维表Join中使用Replicated Shuffle Hash策略(Skew只是一个语法糖,底层的实现是用的Replicated Shuffle Hash策略)。

  • 使用限制

    • 每个SKEW提示只能指定1张表。

    • 表名需要为存在数据倾斜的主表名称,而不是维表名称。

    • 当前不支持更新流,当主流是更新流时,使用SKEW策略会报错。

代码示例:

--维表join 
select /*+ SKEW(t1) */  
t.driver_id
,t2.driver_value
FROM tmp t1 
LEFT JOIN dim_tmp FOR SYSTEM_TIME AS OF t1.proctime AS t2
  ON  t1.driver_id = t2.driver_id 

⚠️重要

  • 当前LOOKUP Hint的shuffle选项已能覆盖 SHUFFLE_HASH hint功能,两者同时使用时,会优先采纳LOOKUP hint的shuffle选项。

  • 当前LOOKUP Hint的shuffle选项还未支持解决数据倾斜的功能,当和REPLICATED_SHUFFLE_HASH、SKEW同时使用时,会优先采纳REPLICATED_SHUFFLE_HASH、SKEW对应的shuffle策略。

Flink双流JOIN 阅读详情

相关推荐

Flink Sql Hive维表Join

Fink 1.12 Hive维表Join

4405

Flink SQL --维表join

flink sql 维表join

chbxw 4108

Flink Lookup Join问题及优化

一般用local cache优化性能问题。

qq_34125992的博客 1452

转载,维表join详解

维表是数仓中的一个概念,维表中的维度属性是观察数据的角度,在建设离线数仓的时候,通常是将维表与事实表进行关联构建星型模型。在实时数仓中,同样也有维表与事实表的概念,其中事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL,HBase)。对于每条流式数据,可以关联一个外部维表数据源,为实时计算提供数据关联查询。维表可能是会不断变化的,在维表JOIN时,需指明这条记录关联维表快照的时刻。需要注意是,目前Flink SQL的维表JOIN仅支持对当前时刻维表快照的关联(处理时间语义),而不支持事实

qq_31866793的博客 1448

维表 join 的解决方案

好的,维表(Dimension Table)关联(Join)是数据处理中的常见需求,尤其在数据仓库和实时计算场景中。

2301_80954266的博客 1145

flink sql 知其所以然(十四):维表 join 的性能优化之路(上)附源码

看了那么多的技术文,你能明白作者想让你在读完文章后学到什么吗?大数据羊说的文章会让你明白 大数据羊说 用数据提升美好事物发生的概率~ 43篇原创内容

qq_34608620的博客 3215

FlinkSql维表join之Temporal table join

FlinkSql维表join之Temporal table join

my_power520的博客 681

Selenium自动化测试遇到shadow-root元素?3种实用解决方案帮你搞定

本文针对Selenium自动化测试中遇到shadow-root元素难以定位的常见问题,提供了三种实用的解决方案。详细阐述了通过JavaScript直接穿透Shadow DOM、利用浏览器工具快速获取JS Path以及使用Python第三方库进行优雅封装的方法,并分享了提升脚本健壮性的实战策略与最佳实践,帮助测试人员有效应对现代Web组件化开发带来的挑战。

code8的博客 408

Arctic 实时维表 Join 原理解析

背景介绍维度表是数据仓库中的概念。它记录了事实表中属性的多维度详细信息。在数据分析、实时监控、精准推荐等业务中,需要维表 Join 来丰富事实表的信息,进而作进一步计算分析。其在生产实践中具有广泛的应用。在实时计算中,Flink 开放了通用的 LookupJoin API,Connector 开发者只需实现一个自定义函数就能快速实现 LookupJoin 功能。需要在该函数中检索出对应 key 的...

NetEaseResearch的博客 1764

手把手教你用FPGA实现SGMII接口:从IP核配置到板级调试全流程

本文详细介绍了如何在Xilinx 7系列FPGA上实现SGMII(Serial Gigabit Media Independent Interface)接口的全流程,包括IP核配置、约束编写和硬件调试。通过具体的硬件选型建议、软件工具链配置和PCB设计规范,帮助开发者快速构建稳定可靠的千兆通信链路,并提供了常见故障排查和性能优化技巧。

weixin_29194693的博客 294

linux和mac安装+配置circos(

一定要下载完这两个包,GD才会work,要不然会报错,且-modules显示也是fail。官网的教程说的很明白,但是很多包都已经过时了需要在网上找。一般来讲,所有包的安装都不会太困难,除了GD。1.是因为官网给的链接下出来的tgz无法解压。2.我的电脑安装后GD照样是fail的。,进入这个地址下一个.tgz。第二点的原因在于,官网的情况。,进入这个地址,按部就班。GD安装困难有以下几点。搞了一天终于配置成功。

xiufan1的博客 549

Flink SQL 优化实战 - 维表 JOIN 优化

从源码层面分析维表 Join 原理及调优方案

cloudbigdata的博客 7667

P1003 [NOIP2011 提高组] 铺地毯 python题解

解题思路: 1、根据题意,所有地毯都是挨着铺的,所以最上面的一条符合题意的一定是从后往前数的第一条符合题意的。 2、符合题意要求x和y同时满足大于等于地毯左边坐标并且小于等于地毯右边坐标。 代码如下: n = int(input()) a = [] for i in range(n): a.append(list(map(int,input().split()))) x,y = list(map(int,input().split())) l = len(a) while l > 0: ..

繁华三千东流水不舍昼夜的博客 1620

Flink SQL维表JOIN与异步优化

使用 JOIN 当前维表功能需要注意的是,如果维表插入了一条数据能匹配上之前左表的数据时,JOIN的结果流,不会发出更新的数据以弥补之前的未匹配。在使用维表 JOIN 时,如果维表数据不大,或者 miss key (维表中不存在的 key)非常多,则可以使用 ALL cache,但是可能需要适当调大节点的内存,因为内存需要能同时容纳下两份维表拷贝。的关键字,其含义是每条到达的数据所关联上的是到达时刻的维表快照,也就是说,当数据到达时,我们会根据数据上的 key 去查询远程数据库,拿到匹配的结果后关联输出。

金州饿霸吃不饱的博客 1282

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 487

ADC实现模数转换Multisim电路仿真——硬件工程师笔记

8位模数转换器(ADC)是将模拟信号转换为8位数字信号的电子器件,具有256级量化能力。其工作原理分为采样、量化和编码三个阶段,关键参数包括分辨率、采样率、精度、线性度和信噪比。常见型号有ADC0804、ADC0808等,广泛应用于数据采集、音频处理、通信系统和消费电子产品中。典型应用时需要配置参考电压、模拟输入和数字输出引脚,并通过仿真实验验证转换效果(如-10V对应输出0,10V对应255)。硬件工程师需掌握其原理和参数选择,相关笔试面试资料可在优快云博客获取。

XU157303764的博客 1507

Flink维表Join

衡量指标 总体来讲,关联维表有三个基础的方式:实时数据库查找关联(Per-Record Reference Data Lookup)、预加载维表关联(Pre-Loading of Reference Data)和维表变更日志关联(Reference Data Change Stream),而根据实现上的优化可以衍生出多种关联方式,且这些优化还可以灵活组合产生不同效果(不过为了简单性这里不讨论同时应用多种优化的实现方式)。对于不同的关联方式,我们可以从以下 7 个关键指标来衡量(每个指标的得分将以 1-..

GavinKai 4152

【项目实战】分布式日志系统 之 Exactly-once 语义:确保数据处理的精确性

在分布式系统的数据传输与处理中,是一种核心可靠性保障,其目标是确保数据“仅被处理一次”——既不重复(避免多次处理),也不遗漏(避免未处理)。与,二者共同保障数据处理的精确性。Exactly-once 语义是分布式系统中数据可靠性的高级目标,其核心通过“幂等设计”(解决重复问题)和“分布式事务”(解决原子性问题)实现。在实际应用中,常结合 At-Least-Once 语义与幂等性,或通过事务 API 与唯一 ID 去重的组合,平衡可靠性与系统性能。

奶爸的编程之路,也就一周冷个三天 166

Flink 中维表 Join 的实现方式与优化策略

在 Flink 大数据处理框架的实际应用场景里,常常会碰到这样的需求:进入 Flink 的实时数据,需要关联存储在外部设备(像 MySQL、HBase 等)中的数据(也就是维表),以此来得出完整准确的计算结果。本文将深入探讨 Flink 中维表 Join 的多种实现方式及其优缺点,助力大家在不同业务场景下做出合理抉择。

天冬忘忧的博客 2184

Experion PKS系列开发:I_O模块_ExperionPKS与第三方I-O模块的集成

通过上述步骤,可以成功将第三方I/O模块集成到Honeywell Experion PKS系统中,实现对现场设备的监视和控制。集成过程中需要注意选择合适的第三方模块,配置正确的通信参数,编写正确的控制逻辑,并进行充分的测试,以确保系统的稳定性和可靠性。不同的通信协议(如Modbus、Profibus、Ethernet/IP、CANopen、OPC UA)有其独特的配置和编程方法,但总体流程相似。在实际应用中,根据项目需求选择合适的协议和模块,可以有效提高系统的灵活性和适应性。

zhubeibei168的博客 1099

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Flink:维表 Join 难点和技术方案汇总

目前看,Flink 的 “维表 Join” 主要就三种实现方式,叫法可能会有细微差别,以下是我是用更直白的语言总结的称谓:直连外部数据库进行关联;将维表加载到内存中关联;基于维表变更日志的关联。这些 Join 方案具体会使用到 Flink 的 Lookup Join、Temporal Join 等相关机制,所以在研究维表 Join 方案前,应先补齐这部分的知识,具体可参考本文末给出的本博客相关系列文章。

Laurence的技术博客 2921

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Flink SQL 功能解密系列 —— 维表 JOIN 与异步优化

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34090643的博客 2688

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

FlinkSQL维表Join实战指南

在实时数据处理场景中,我们经常需要将流数据与静态或动态变化的数据进行关联,这些静态或动态变化的数据被称为“维表”。例如,在电商订单实时分析中,需要将订单流中的商品ID关联商品维表获取商品名称、类别等信息;在用户行为分析中,需要将用户ID关联用户维表获取用户画像数据。Flink SQL作为Flink生态中处理实时数据的核心组件,提供了灵活高效的维表Join能力。本文将从维表Join的基本概念出发,深入讲解Flink SQL中不同类型维表Join的实现方式、适用场景,并结合实战案例帮助大家快速上手,最后给出性能

supper_M的博客 1238

Flink 维表关联方案

Flink 维表关联方案

猫猫爱吃小鱼粮 3492

大数据Flink培训:维表Join/双流Join的方法

一、背景 事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL,HBase)。对于每条流式数据,可以关联一个外部维表数据源,为实时计算提供数据关联查询。维表可能是会不断变化的,在维表JOIN时,需指明这条记录关联维表快照的时刻。需要注意是,目前Flink SQL的维表JOIN仅支持对当前时刻维表快照的关联(处理时间语义),而不支持事实表rowtime所对应的的维表快照。 二、维表Join 预加载维表 将维表全量预加载到内存里去做关联,具体的实现方式就是我们定义一个类,去实现 Ric

weixin_45695430的博客 1252
上一篇: 基于doris用户画像标签储存应用
elephant_1987
博客等级 码龄5年 20粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值