再谈 Flink 的 “动态表” 和 “流表二象性”

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

尽管我们在此前的多篇文章中介绍过动态表的概念,但这个概念确实有一些抽象,伴随着学习的地深入,也会有会新的领悟,本文再次去动态表和表流二象性做一些梳理。此前对动态表的介绍可参考《Flink 动态表 (Dynamic Table) 解读》和《Flink 实时数仓关键技术解读:Upsert Kafka 和 动态表》两篇文章。

1. 回顾


[ 官方文档 ] 中绘制过这样一张描述动态表和连续查询的图:

Dynamic tables

  1. 将流转换为动态表。
  2. 在动态表上计算一个连续查询,生成一个新的动态表。
  3. 生成的动态表被转换回流。

注意:动态表首先是一个逻辑概念。在查询执行期间不一定(完全)物化动态表;此外,要注意的一点是:“状态”(State)是维迟在持续查询上的,不是动态表上,这一点不搞错,是查询本身的内容(SQL)决定了会维持什么样的“转态”!

但是,从”表流一体“或”流表二象性“的角度看,其实改为下面这样会更准确一些,至于为什么,我们在下一节介绍完“表流二象性”后就会理解。

stream-query-stream

2. 流表二象性


对于“动态表”在使用时是一张“表”,实际运行的形态却是一条“流”这种情形被概括为“表流二象性”,下面的动图非常好的解释了流表之间的关系:

Figure 4. Every table has its own change stream (also called a changelog).

在这张动图中,我们可以形象而准确地看到:

  • 下侧的 Stream 和 中间 Table 的 ”联动“ 很好地诠释了 ”表流一体“ 或 ”表流二象性“,如果非要再细致一点解释的话,此时中间 Table 的输出其实是 Flink Sql Client 在 Table 模式下的输出(自动刷新表的当前转态)

  • 伴随流上数据不停地输入,表本身也是在不断变化的,且这种变化是由输入数据直接触发的,是一种固有的动态能力,与批处理中的轮训完全是两回事,这大概就是”动态表“叫法的来历

  • 上侧的 Stream 记录的是表自身的 changelog,也就是交给下游或物化时的 ”输出“(也是一条流)

下图是另一张解释 ”表流一体“ 或 ”表流二象性“的动图,相对上一张图,它用棋盘举例更加形象:

Figure 1. Streams record history. Tables represent state.

不过,这张图并没有上一张图严谨,主要的问题在于:没有说明左侧的”操作记录“流是右侧棋局变化的”因“还是”果“,如果是”因“,那左侧就是输入的数据流,右侧是对应的动态表,这时相当于上一张图中的 ”Stream“ 和 ”Tabel“ 两条线;如果是”果“,那左侧就是输出的数据流,右侧依然是动态表,这时相当于上一张图中的 ”Stream(changelog)“ 和 ”Tabel“ 两条线。

3. 从代码层面重新理解


现在,我们得从实际代码层面把动态表的概念打通,核心问题就是:动态表的 DDL 定义了什么?持续查询又做了什么?这方面,有如下重要的结论:

所谓“动态表的 DDL”这种叫法其实是有问题的,因为动态表就是流上的结构化数据,没有 DDL 这一说,并且,也并不是所有的动态表都和一个 DDL 相对应,考虑一个只有 SELECT 没有 INSERT INTO 的持续查询,SELECT 的结果集肯定也是一张动态表,对应一个转换后的流,但它是没有对应的 DDL 的。Flink SQL 的 DDL 定义的其实是流的 Source 或 Sink 的连接方式、数据结构、传输格式。只是绝大多数的流都是从一个 Source Table 到一个复杂的持续查询(INSERT INTO … SELECT …)最后写入一个 Sink Table,会让人习惯性地把 DDL 当作了 动态表 的定义,这一点一定要注意其中细微差别!

3.1 动态表定义了什么?


动态表的 DDL 定义了三项核心要素:

  • 数据结构
  • 数据源(connector)
  • 传输格式(format)

有了这些信息,Flink 就可以:

  • 当动态表是 Source 时:从源头获得数据 -> 按指定的数据结构封装成指定的格式传输 -> 成为数据流 / 表现为一张表(动态表)
  • 当动态表是 Sink时:实时读取动态表(动态表的 changelog 流) -> 按指定的数据结构封装成指定的格式传输 -> 写入目标数据源

3.2 持续查询又做了什么?


从 ETL 的角度看,持续查询完成了最核心的 ETL 逻辑,从整个流式处理管道的角度看,是持续查询驱动了整个 Pipeline 运转,只有动态表的 DDL,不会有任何流或对应的动态表产生,只有当一个持续查询启动时,整条流式链路才会创建并运转起来。下图能更好地体现“流”,“动态表”,“持续查询”三者之间的关系:

请添加图片描述

参考资料

https://www.confluent.io/blog/kafka-streams-tables-part-1-event-streaming/#stream-table-duality

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

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

相关文章

Modbus串口通信

Modbus ASCII与RTU? 发送报文的方式不一样 ASCII:将数据转换成1 6进制ASCII码再发送 RTU:直接发送原始报文当然也是进制 Modbus-与RS485有何区别? Modbus是通信协议 RS485电气接口规范 Modbus软件 RS485硬件 比如高速公路与汽车的关系,TCP/IP与网线…

瑞_Redis_商户查询缓存_什么是缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 附:缓存封装工具类 🙊 前言:本文章为瑞_系列专栏之《Redis》的实战篇的商户查询缓…

Mq之pulsar的入门使用(一)

目录 一、linux集群安装pulsar 注意事项 编辑 /etc/hostname与/etc/hosts 执行初始化命令 二、创建应用程序对消息的生产和消费进行测试 物理主机启动应用发送消息时报错处理程序的搭建及说明使用到的pom依赖springboot中pulsar配置接收消息模拟发送消息发送与接收消息打印…

Java-SSM医院在线预约系统

Java-SSM医院在线预约系统 1.服务承诺: 包安装运行,如有需要欢迎联系(VX:yuanchengruanjian)。 2.项目所用框架: 前端:JSP、layui等。 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 1.管理员功能: a.修改个人信息…

【图解物联网】第6章 物联网与数据分析

6.1 传感器数据与分析 从前几章中我们已经了解到,只要把配备传感器的设备连接到网络,就能把所有的信息采集到物联网服务之中(图6.1)。 从工业角度而言,给工厂中的生产流水线和流通的产品打上电子标签&#x…

Linux 系统是如何收发⽹络包的

Linux 系统是如何收发⽹络包的? ⽹络模型 为了使得多种设备能通过⽹络相互通信,和为了解决各种不同设备在⽹络互联中的兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference Mode…

了解Kafka位移自动提交的秘密:避免常见陷阱的方法

欢迎来到我的博客,代码的世界里,每一行都是一个故事 了解Kafka位移自动提交的秘密:避免常见陷阱的方法 前言位移自动提交简介自动提交的优缺点自动提交位移的优点:自动提交位移的缺点:自动提交与手动提交的对比分析&am…

安捷伦Agilent E4440A频谱分析仪

181/2461/8938产品概述: 这是一篇关于安捷伦Agilent E4440A频谱分析仪的详细指南。在这篇文章中,您将了解该设备的基本概述、技术规格、使用方法、应用场景以及与其他类似设备的比较。让我们一起深入了解Agilent E4440A频谱分析仪的各个方面。 让我们简…

软件杯 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目…

DashVector - 阿里云向量检索服务

DashVector 文章目录 DashVector一、关于 DashVector二、使用 DashVector 前提准备1、创建Cluster:2、获得API-KEY3、安装最新版SDK 三、快速使用 DashVector1. 创建Client2. 创建Collection3、插入Doc4、相似性检索5、删除Doc6. 查看Collection统计信息7. 删除Coll…

js中多重引号会导致函数的参数失效报错-Invalid or unexpected token

在js使用中我们经常会使动态添加html信息到元素对象中,且还加入了函数及其,函数对应参数,这个时候就会使用多重引号去拼接,如果拼接中没有做引号的转义,就会出现Invalid or unexpected token。 例如以下代码&#xff0…

【嵌入式——QT】Charts常见的图表的绘制

【嵌入式——QT】Charts常见的图表的绘制 柱状图QBarSetQBarSeriesQBarCategoryAxis图示 饼图堆叠柱状图百分比柱状图散点图和光滑曲线图代码示例 柱状图 QBarSet 用于创建柱状图的数据集。 主要函数 setLabel():设置数据集标签 ;setLabelBrush()&am…

复习斐波那契(用C++写)

或者这样写: 斐波那契数列 题目描述 斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1 1 1,接下来每个数都等于前面 2 2 2 个数之和。 给出一个正整数 a a a,要求斐波那契数列中第 a a a 个数是多少。 输入格式…

Windows下MySQL服务启动常见的两种方式,完美适配Mysql5.7,MySql8.0

文章目录 一、图形界面下启动mysql服务二、在命令行重新启动mysql服务3 推荐阅读4 源码获取: Windows系统下,MySQL服务的启动,常见的两种启动方式如下: 一、图形界面下启动mysql服务 在图形界面下启动mysql服务的流程如下&#x…

算法体系-13 第十三 二叉树的基本算法+二叉树的递归套路

一 完全二叉树的判断 1.1 描述 完全二叉树:他每一层都是满的,即使不满也是最后一层不满,最后一层不满也是从左到右变满的;话句话说就是 完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充&#x…

Elasticsearch数据存储优化方案

优化Elasticsearch数据存储有助于提升系统性能、降低成本、提高数据查询效率以及增强系统的稳定性和可靠性。通常我们再优化Elasticsearch数据存储会遇到一些问题,导致项目卡壳。以下是优化Elasticsearch数据存储的一些重要作用: 1、问题背景 在某些场景…

我的春招求职面经

智能指针在面试时经常被问到,最近自己也在写,有一点思考,于是找到了这样一个题目,可以看看,上面这个代码有什么问题?留言区说出你的答案吧! 最后分享一下之前的实习->春招->秋招等文章汇总…

地质灾害在线监测,精准预警智能化

自然灾害无情且威力巨大,对人类生命财产安全造成严重威胁。地质灾害作为重要的自然灾害类型之一,给人类社会带来了沉重的经济损失和生命威胁。及时掌握地质灾害信息,提高预警能力和监测水平,是保障人民群众生命财产安全的当务之急。(key-iot.com.cn/18703.html&…

Juniper SRX 防火墙基础上网配置

简介 基于PNET-LAB模拟器,使用 vSRX-NG 23.4R1.9 镜像进行实验。 博客:https://songxwn.com/Juniper-SRX-snat/ 实验需求 配置WAN口 LAN口,实现基础的上网功能。配置NAT、DHCP。 ISP 路由器使用Cisco IOS模拟,与SRX对接口配置…

docker镜像安装空间不足no space left on device

报错:Error processing tar file(exit status 1): open /usr/local/lib/libmkl_tbb_thread.so.1: no space left on device 原先docker模型保存位置: docker info -f ‘{{ .DockerRootDir}}’ docker 高点版本,这里26.0 解决参考&#xf…