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

《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。

目前看,Flink 的 “维表 Join” 主要就三种实现方式,叫法可能会有细微差别,以下是我是用更直白的语言总结的称谓:

  • 直连外部数据库进行关联
  • 将维表加载到内存中关联
  • 基于维表变更日志的关联

这些 Join 方案具体会使用到 Flink 的 Lookup Join、Temporal Join 等相关机制,所以在研究维表 Join 方案前,应先补齐这部分的知识,具体可参考本文末给出的本博客相关系列文章。

网上有这样一篇文章《Flink DataStream 关联维表实战》,总结得已经非常好了,我们不打算重新发明轮子,本文更像是一篇学习笔记。

1. 直连外部数据库进行关联


顾名思义,这种方式就不需要再解释了。Flink 中的 Lookup Join 就是应用在这种场景下的。我们来分析一下这种关联方式的优缺点,应该说它的优缺点是非常鲜明的:

  • 优点

    • 实现简单 => 是所有管理方式中最容易实现的
    • 实时性高 => 维表发生变更后能立即反映到关联的结果集中
    • 不占用内存 ( 能够关联较大的维表 ) => 维度数据是直接从数据库查询获得,不会占用 Flink 工作节点的内存,这也就意味着能关联较大的维表
  • 缺点

    • 数据库负载高 ( 容易成为性能瓶颈 ) => 流上的 Join 是持续查询,对维表数据库的访问会异常频繁,极易导致性能问题
  • 适用场景:

    • 数据流量不大的流

    • 项目初期的原型快速实现

鉴于直连外部数据库进行关联对数据库的压力过大,有一些优化措施可以适当缓解一下数据库的压力,具体地说主要是“异步查询“和”引入缓存“两种优化措施,而上面说的默认实现方式是”同步查询“,这样,在该选型下,总共有三种细分方案。

1.1. 同步查询


没有任何特别之处,默认情况下,使用客户端查询数据库都是同步模式。同步模式的性能问题会尤为突出,没有做任何优化。

1.2. 异步查询


要想在 Flink 中异步访问数据库,首先需要目标数据库本身支持异步查询(提供异步查询的客户端、类库),然后,再基于 Flink 的 Async I/O API 进行一层封装才能实现异步查询。异步查询可以显著提升查询的吞吐量,但不能保准顺序性,所以在维度数据变更前后有可以会出现关联了错误版本的维度数据(无序性),通常,维表的变化速率都不会太快(缓慢变化维度),一般的应用是可以接受这种情况的,且流上的数据进入流计算引擎时本身就已经有了一定的时延,所以异步导致的问题基本都是可以忽略不计的。如果对关联的时间尺度要求极高,则应考虑”基于维表变更日志的关联“。

1.3. 引入缓存


和 Web 应用中引入缓存加速数据读取性能一样,Flink 程序也可以引入缓存实现同样的目标。这部分的实现其实和 Flink 本身的 API 没有太大关系,只是运行环境是 Flink 罢了,这个命题其实可以改为:在 Java 程序中有没有好的缓存框架以及如何使用。这一块可以研究一下 Guava Cache,看上去是目前 Java 平台上比较主流的缓存框架了。当然,引入专门的分布式缓存基础设施也是可考虑的方案之一。

引入缓存的收益是非常明显的,只是如何保持缓存数据和数据库的数据一致是比较麻烦的,同异步查询一样,如果对关联的时间尺度要求极高,在没有很好的缓存更新策略下,还是应考虑”基于维表变更日志的关联“。

2. 将维表加载到内存中关联


“将维表加载到内存中关联” 像是 “直连外部数据库实时关联” 的反向极端,它的优缺点也是非常鲜明的:

  • 优点

    • 极致的性能 => 不会有这种方式更快的关联方式了
    • 高吞吐量 => 数据驻留内存,吞吐量瓶颈只取决于 Flink 集群自身
    • 数据库负载低 => 对数据库的压力几乎可以忽略不计
  • 缺点

    • 高内存占用 => 占用过多内存,不能加载过大,过多的维表
    • 实时性差 => 源表维度数据发生变更后,内存中的数据感知不到,只能手动触发更新或定时刷新
  • 适用场景

    • 体量小且几乎不会变更表,例如:字典表

在《Flink DataStream 关联维表实战》一文中还详细介绍了该方法下的几种优化方案,包括:只加载特定分区的数据缓解内存压力,如何进行定时的数据刷新,以及将加载数据到内存与直连数据库两种方法结合起来使用,详情可参考原文。

3. 基于维表变更日志的关联


基于维表变更日志的关联就是 Flink 的 Temporal Join,所以这种方法会细分为:

  • 使用基于事件时间的 Temporal Join 关联维表
  • 使用基于处理时间的 Temporal Join 关联维表

基于事件时间的维表关联,在时间尺度上是最严格,最准确的,它能确保关联到事实表数据所代表的事件在发生时维表上当时的对应数据,如果业务场景的维表变更速率很快,业务上又不容许任何时间上的错误关联(例如关联汇率表进行汇率换算),则这是唯一的关联方式。

基于处理时间的 Temporal Join 关联维表在时效性上其实也能满足绝大多数的场景需求,因为大多的维表变更速率都不快(缓慢变化维度)。基于基于处理时间的 Temporal Join 和 直连数据库的 Lookup 非常像,以至于有人错误地将它们认成是同一种关联方式,它们的主要区别是:Lookup Join 是直连数据查询的,而 “基于处理时间的 Temporal Join” 是构建在 Flink 上的动态表,变更是靠 CDC 实时同步的;Lookup Join 需要高频访问数据库,对于数据库会造成较高的负载,而“基于处理时间的 Temporal Join”维表数据是在流上,维表变化是通过 CDC 更新的,所以,后者不会对维表数据库造成压力。

  • 优点

    • 实时性高 => 尤其基于事件时间的 Temporal Join,实时性和准确性是最高的
    • 数据库负载低 => 对数据库的压力几乎可以忽略不计
  • 缺点

    • 内存占用高 => 其内存占用没有“将维表加载到内存中关联”那样高,但是对于大的维表,为了维持状态,依然会占用相当可观的内存
  • 适用场景

    • 对关联的实时性和时态上的准确性要求严格的场景,如:关联汇率表计算汇率

关于这种方式的实现难度其实还好,主要是前期要积累足够的知识,包括 Flink CDC, Upsert-Kafka,Temporal Join 等,实现的代码并不多,只是知识密度比较高。

3.1 使用基于事件时间的 Temporal Join 关联维表


关于这种实现方式,请参考本博客另外两篇文章:

  • 《Flink Temporal Join 系列 (1):用 Temporal Table DDL 实现基于事件时间的关联》
  • 《Flink Temporal Join 系列 (3):用 Temporal Table Function 实现基于事件时间的关联》

3.2 使用基于处理时间的 Temporal Join 关联维表


关于这种实现方式,请参考本博客另外两篇文章:

  • 《Flink Temporal Join 系列 (2):用 Temporal Table DDL 实现基于处理时间的关联》

  • 《Flink Temporal Join 系列 (4):用 Temporal Table Function 实现基于处理时间的关联》


参考资料

  • 《Flink DataStream 关联维表实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(十一) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(十三) 48、sqlite3_stmt_isexplain sqlite3_stmt_is…

2024蓝桥杯每日一题(单调队列)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:单调栈 试题二:滑动窗口 试题三:子矩阵 试题四:最大子序和 试题一:单调栈 【题目描述】 给定一个长度为 N 的整数数列,输出每…

jvm提供的远程调试 简单使用

JVM自带远程调试功能 JVM远程调试,其实是两个虚拟机之间,通过socket通信,达到远程调试的目的; 前提 确保本地和远程的网络是开通的; 本地操作 远程操作 在启动命令参数中 把上面的内容复制进去

【3GPP】【核心网】【4G】4G手机接入过程,手机附着过程(超详细)

1. 4G手机接入过程,手机附着过程 附着(Attach): 终端在PLMN中注册,从而建立自己的档案,即终端上下文 进行附着的三种情况: ①终端开机后的附着,初始附着 ②终端从覆盖盲区返回到…

解决用POI库生成的word文件中的表格在python-docx无法解析的问题

问题背景 用apache-poi生成word文件中表格&#xff0c;在使用python-docx库解析时报错&#xff1a; 问题分析 1. word文档本质上是一个rar压缩包&#xff0c;用winrar解析后如下&#xff1a; 2. 查看document.xml&#xff0c;可以看到table元素下面是没有<w:tblGrid>这…

Vue3快速上手(十七)Vue3之状态管理Pinia

一、简介 Pinia官网:https://pinia.vuejs.org/zh/ 从官网截图里可以直接看到,pinia是一个vuejs的状态(数据)管理工具。功能性同vuex。logo是小菠萝。它是一个集中式状态管理工具。就是将多个组件共用的数据管理起来,重复利用。有点类似缓存的意思。 二、Pinia环境搭建 …

【LVGL-按钮按钮矩阵部件】

LVGL-按钮&按钮矩阵部件 ■ LVGL-按钮部件■ 按钮部件&#xff1a; 点击三个按钮一个回调函数修改label值。 ■ LVGL-按钮矩阵部件■ 示例一&#xff1a;按钮换行&#xff0c;和宽度设置。■ 示例二&#xff1a;设置按钮宽度为2倍■ 示例三&#xff1a;获取点击的按钮下标&…

大数据主要组件HDFS Iceberg Hadoop spark介绍

HDFSIceberghadoopspark HDFS 面向PB级数据存储的分布式文件系统&#xff0c;可以存储任意类型与格式的数据文件&#xff0c;包括结构化的数据以及非结构化的数据。HDFS将导入的大数据文件切割成小数据块&#xff0c;均匀分布到服务器集群中的各个节点&#xff0c;并且每个数据…

Gartner发布网络安全应用生成式AI指南:应用生成增强功能提升企业网络安全能力和效率的三个领域及9个实例

生成增强功能是专门为提高知识工作者的生产力、解决网络安全技能短缺问题并降低大型语言模型带来的风险而构建的。安全和风险管理领导者通过在运营中采用生成增强来提高团队的能力。 主要发现 与其他人工智能实现相比&#xff0c;生成式人工智能 (GenAI)解决方案&#xff0c;特…

绿色节能|AIRIOT智慧建材能耗管理解决方案

建材供应是建筑业不可或缺的一个重要环节&#xff0c;在环保和企业可持续发展的双重需求下&#xff0c;建材生产商对建材生产过程中的能耗掌握和能耗管理尤其关注。但在实际生产和运营过程中&#xff0c;传统的建材能耗管理方式往往存在如下痛点&#xff1a; 用户管理权限不完善…

汽车ECU的虚拟化技术(五) -- 对MCU虚拟化实现难点的思考

目录 1.概述 2.虚拟化软件的难点 2.1 虚拟化中的中断处理 2.2 虚拟ECU的通信 3.小结 1.概述 在上面文章里汽车ECU的虚拟化技术(四) -- 对MCU虚拟化实现难点的思考-CSDN博客&#xff0c;解了OEM面临新的电子电气架构下的集成难点&#xff0c;引入了hypervisor以及VM调度机制…

ARM-Linux 开发板下安装编译 OpenCV 和 Dlib

安装 OpenCV 和 Dlib 不像在 x86 平台下那样简单&#xff0c;用一句命令就可以自动安装完。而在 ARM 平台中许多软件都需要自行下载编译&#xff0c;且还有许多问题&#xff0c;本篇文章就是记录在 ARM 平台下载 OpenCV 踩过的坑。 硬件环境&#xff1a; RK3568 Ubuntu20.04…

全国大学生数学建模大赛备赛——相关系数的求解(皮尔逊(pearson)、斯皮尔曼(spearman)、肯德尔(kendall)相关系数)

相关系数是用来衡量两个变量之间线性相关程度的指标。它的取值范围在-1到1之间&#xff0c;当相关系数为1时表示两个变量完全正相关&#xff08;即一个变大另一个也变大&#xff09;&#xff0c;当相关系数为-1时表示两个变量完全负相关&#xff08;即一个变大另一个变小&#…

定制 Elasticsearch 镜像

安装ik分词器 下载ik分词器 下载地址&#xff1a;https://github.com/infinilabs/analysis-ik/releases Dockerfile FROM docker.elastic.co/elasticsearch/elasticsearch:8.12.2 COPY ./elasticsearch-analysis-ik-8.12.2.zip /opt/ RUN bin/elasticsearch-plugin instal…

国产DSP FT-M6678开发-网络开发

简介 今天准备调试FT-M6678的网络部分,参考例程是《3. FT-M6678 Project\1. FT-M6678 接口驱动函数\13. GMAC\NDK 协议栈工程-V7.1\03应用例程\UDP\DSP端应用程序\DSP_UDP_Test_V7》,首先参照文档将NDK使用官方提供的NDK进行替换: 将D:\ti\pdk_C667…

FMEA助力新能源汽车行业腾飞:安全、效率双提升

随着新能源汽车市场的迅猛发展&#xff0c;各大车企纷纷加大研发力度&#xff0c;力求在激烈的市场竞争中脱颖而出。其中&#xff0c;FMEA&#xff08;故障模式与影响分析&#xff09;作为一种先进的质量管理工具&#xff0c;正被越来越多地应用于新能源汽车的研发和生产过程中…

深度学习pytorch——链式法则(Chain rule)(持续更新)

这篇文章将会以深度学习的角度解析链式法则。 基本的求导法则 高中的时候就学过&#xff0c;大学高数也巩固了一遍&#xff0c;这里不再赘述。 深度学习中的链式法则 为什么要讲述深度学习中的链式法则&#xff1f; 通过链式法则&#xff0c;我们可以得到中间层信息&#x…

unbantu Apache的基本配置与配置静态资源访问

目录 前言: 1.Apache介绍 2.安装Apache 3. 测试Apache服务是否启动成功 3.1配置Servername 3.2重启服务 4.配置Apache主页面 5. 配置静态的资源 6.为静态资源设置访问权限(基于源地址) 致谢: 前言: 此博客是基于unbantu的Apache服务的详细解析&#xff0c;在这片博…

Elasticsearch面试系列-03

1. Elasticsearch 中 refresh 和 flush 有什么区别? 整体流程: 1、数据写入buffer缓冲和translog日志文件中。当写一条数据document的时候,一方面写入到mem buffer缓冲中,一方面同时写入到translog日志文件中。 2、buffer满了或者每隔1秒(可配),refresh将mem buffer中的…

34 | 到底可不可以使用join?

在实际生产中&#xff0c;关于 join 语句使用的问题&#xff0c;一般会集中在以下两类&#xff1a; 1. 我们 DBA 不让使用 join&#xff0c;使用 join 有什么问题呢&#xff1f; 2. 如果有两个大小不同的表做 join&#xff0c;应该用哪个表做驱动表呢&#xff1f; 今天这篇文…