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

news2024/11/17 16:04:45
《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名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.coloradmin.cn/o/1537989.html

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

相关文章

Vue模块化开发步骤—遇到的问题—解决办法

目录 1.npm install webpack -g 2.npm install -g vue/cli-init 3.初始化vue项目 4.启动vue项目 Vscode初建Vue时几个需要注意的问题-CSDN博客 1.npm install webpack -g 全局安装webpack 直接命令提示符运行改指令会报错,operation not permitted 注意&#…

软件推荐 篇三十七:开源免费无广告的在线音乐免费播放 | MusicFree纯净无广告体验-小众冷门推荐

引言 自从QQ音乐没了杰伦、某云开始收费,除了各种广告弹窗导致电脑卡的要死,打工人就靠这点音乐背景熬夜了,木有办法,得有个开源免费的听歌软件吧,一搜github,软件一大堆,作为一个打工仔&#…

python--for循环

for循环: python中的for循环是用来迭代容器中的每一个元素的,而不是c,java中理解那个循环; for 零时变量 in 容器: print(零时变量) #每一个迭代出的元素 range 全局函数: …

10、chrome拓展程序的实现

一、拓展程序的实现 拓展程序项目的构成 和前端项目一样,拓展程序也是有Html、CSS、JS文件实现的,现在看来它就是一个静态的前端页面。但是不同的是,拓展程序中还需要额外的一个清单文件,就是manifest.json,清单文件可…

Saltstack 最大打开文件数问题之奇怪的 8192

哈喽大家好,我是咸鱼。 今天分享一个在压测过程中遇到的问题,当时排查这个问题费了我们好大的劲,所以我觉得有必要写一篇文章来记录一下。 问题出现 周末在进行压测的时候,测试和开发的同事反映压测有问题,请求打到…

在 Linux/Ubuntu/Debian 上安装 SQL Server 2019

Microsoft 为 Linux 发行版(包括 Ubuntu)提供 SQL Server。 以下是有关如何执行此操作的基本指南: 注册 Microsoft Ubuntu 存储库并添加公共存储库 GPG 密钥: sudo wget -qO- https://packages.microsoft.com/keys/microsoft.as…

活动回顾 | 走进华为向深问路,交流数智办公新体验

3月20日下午,“企业数智办公之走进华为”交流活动在华为上海研究所成功举办。此次活动由上海恒驰信息系统有限公司主办,华为云计算技术有限公司和上海利唐信息科技有限公司协办,旨在通过对企业数字差旅和HR数智化解决方案的交流,探…

企业网络基础设施物理安全面临全新挑战

企业网络基础设施的物理安全是确保业务连续性和数据完整性的关键组成部分。随着技术的发展和环境的变化,这些基础设施面临着新的挑战。以下是一些主要的挑战和的解决方案 一、机房、仓库、档案馆物理安全事件频发的挑战: 1.电力安全事件:市…

Bumblebee双目测量基本原理

一.双目视觉原理 双目立体视觉三维测量是基于视差原理。 图 双目立体成像原理 因此,左相机像面上的任意一点只要能在右相机像面上找到对应的匹配点,就可以确定出该点的三维坐标。这种方法是完全的点对点运算,像面上所有点只要存在相应的匹配点,就可以参与上述运算,从而获…

代码随想录笔记|C++数据结构与算法学习笔记-二叉树(一)|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

全文基于代码随想录及相关讲解视频。 文字链接:《代码随想录》 文章目录 二叉树的递归遍历二叉树的前序遍历C代码如下 二叉树的中序遍历二叉树的后序遍历 二叉树的迭代遍历前序遍历前序遍历C代码 右序遍历右序遍历C代码 中序遍历为什么中序遍历不同中序遍历迭代法的…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务,不仅仅是Apache、MySQL,其他服务也可以使用同样的方法操作,包括开启自己写的脚本服务。 二、效果图 两种状…

【大数据】五、yarn基础

Yarn Yarn 是用来做分布式系统中的资源协调技术 MapReduce 1.x 对于 MapReduce 1.x 的版本上: 由 Client 发起计算请求,Job Tracker 接收请求之后分发给各个TaskTrack进行执行 在这个阶段,资源的管理与请求的计算是集成在 mapreduce 上的…

TCP重传机制详解——01概述

文章目录 TCP重传机制详解——01概述什么是TCP重传?TCP为什么要重传?TCP如何做到重传?TCP重传方式有哪些超时重传(timeout or timer-based retransmission)快速重传(fast retransmission或者fast retransmit)改进的重传机制,早期重…

单机模拟分布式MINIO(阿里云)

拉取的最新MINIO: minio version RELEASE.2024-03-15T01-07-19Z Runtime: go1.21.8 linux/amd64 分布式 MinIO 至少需要4个节点,也就意味着至少4个硬盘,对于囊中羞涩仅用来开发测试的人来说,这笔花销还是比较高昂。有没有更好的…

手机可以看到电脑在干什么吗

手机与电脑之间的连接与互动已成为我们日常生活和工作中的常态。 那么,一个常被提及的问题是:手机可以看到电脑在干什么吗? 答案是肯定的。 随着技术的不断进步,我们现在已经可以通过多种方式实现手机对电脑操作的实时监控。 首…

hadoop namenode 查看日志里面报错8485无法连接

一、通过日志排查问题: 1、首先我通过jpsall命令查看我的进程,发现namenode都没有开启 2、找到问题后首先进入我的日志目录里查看namenode.log [rootnode01 ~]# /opt/yjx/hadoop-3.3.4/logs/ [rootnode01 ~]# ll [rootnode01 ~]# cat hadoop-root-nam…

短视频矩阵系统--技术实际开发打板3年真实开发分享

短视频矩阵系统--技术实际开发打板3年真实开发分享,短视频矩阵系统/矩阵获客系统是一种基于短视频平台的获客游戏。短视频矩阵系统可以通过多账号发布来替代传统的单账号游戏。可以一键发布所有账号,批量制作多个视频AI智能剪辑。过去很多人只能完成的工…

JupyterNotebook 如何切换使用的虚拟环境kernel

在Jupyter Notebook中,如果需要修改使用的虚拟环境Kernel: 首先,需要确保虚拟环境已经安装conda上【conda基本操作】 打开Jupyter Notebook。 在Jupyter Notebook的顶部菜单中,选择 “New” 在弹出的窗口中,列出了…

练习 12 Web [极客大挑战 2019]BabySQL

本题复习:1.常规的万能语句SQL查询,union联合查询,Extractvalue()报错注入 extractvalue(1,concat(‘0x7e’,select(database())))%23 我一开始挨着试,感觉都无效 直到报错注入,查到了库名‘geek’ 尝试查表名&…

长三角科技盛会“2024南京国际人工智能,机器人,自动驾驶展览会”

2024南京国际人工智能,机器人,自动驾驶展览会 2024 Nanjing International Ai, Robotics, Autonomous Driving Expo 时间:2024年11月22-24日 地点:南京国际博览中心 南京,这座历史悠久的文化名城,如今正站在新一轮科技产业变革的前沿,以人工…