Flink:流上的“确定性”(Determinism)

1. 什么是“确定性”


先明确一下什么叫“确定性”:对于一个“操作”来说,如果每次给它的“输入”不变,操作输出的“结果”也不变,那么这个操作就是“确定性“的。通常,我们认为批处理的操作都是确定的,比如针对一张 clicks 表,假如表中的数据没有变化,无论我们执行多少次 SELECT * FROM clicks 操作,它的结果始终不变。但是,批处理操作并不一定总是“确定性”的,如下的 SQL:

SELECT * FROM clicks
WHERE cTime BETWEEN TIMESTAMPADD(MINUTE, -2, CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP;

会随执行的时间点不同而呈现不同的结果(clicks 表数据没有变化),原因是 SQL 中的时间函数 CURRENT_TIMESTAMP 在每次执行时返回的值都不一样;

另一个示例是 UUID 函数:

SELECT UUID() AS uuid, * FROM clicks LIMIT 3;

该函数是会为每一条记录生成唯一的 UUID,所以每次执行的结果也必然是不同的。

2. 批处理中的“不确定性”


批处理中的“不确定性”都是由函数引起的,上述两个示例都导致了结果的不确定性,但是它们却是有差异的,而且这种差异其实是非常“鲜明”的:

  • CURRENT_TIMESTAMP 为代表的函数是在生成查询计划时执行的,只会执行一次,所以所有记录得到的是同一个值,这类函数叫“动态函数”
  • UUID 为代表的函数在每条记录上都会执行一次,生成独立的值,所以所有记录得到的是不同的值,这类函数叫“不确定函数”

官方文档的解释是:

在确定性函数之外存在不确定函数(non-deterministic function)和动态函数(dynamic function, 内置的动态函数以时间函数为主)两类,不确定函数会在运行时(即在集群执行,每条记录单独计算),而动态函数仅在生成查询计划时确定对应的值, 运行时不再执行(不同时间执行得到不同的值,但同一次执行得到的值一致)。

简单总结一下:批处理中的“不确定性”是由不确定函数和动态函数两种函数引起的,前者产生的变化值会作用在每一条记录上,而后者产生的变化值仅作用在一次执行中(每执行一次变化一次,一次执行中记录得到值是一样的)

3.流处理中的“不确定性”


和批处理相比,流处理中的“不确定性”因素明显增多,本质上,还是因为流处理的两大核心特性导致的:1. 流处理抽象出的表是“无边界的”;2. 流处理的查询是“连续的”,以下是流处理中几种典型的“不确定性”:

补充:在官方文档中,讨论流上的“不确定性”时,先介绍了一种情况:原来在批处理中的动态函数,跑到流式场景中,就“降级”成了不确定函数,举的例子是 函数,这里文档只是想说明流处理的特性对不确定性有很大的影响,但这个 Case 不是流处理中的“不确定性”的示例,因为动态函数(这里的CURRENT_TIMESTAMP )在批处理中本来就是“不确定性”的了。

3.1. 外部输入的不确定性


官方文档中的描述叫作 “Source 连接器回溯读取的不确定性”,本人不太喜欢这个称谓,因为它没有描述出“不确定性”的本质原因。实际上,这种情况就是说:流计算并不能对外界的数据(上游数据)进行强有力的控制,导致及时你使用相同的时间参数和配置,以流式重新读取数据时,可能依然会导致结果是不一样的。其实这种情况并不能算是一种很 “Strong” 的“不确定性”,在输出可能会发生变化的情况下,是不会存在任何确定性操作的,所以,这一点不是很值得强调。

3.2. 基于处理时间的不确定性


其实这类不确定性和前面批处理中起到的 CURRENT_TIMESTAMP 情形是很类似的,只是这里问题的只发生在流上,主要是和基于处理时间运作的一些函数和机制有关!因为:区别于事件时间,处理时间是基于机器的本地时间,这种处理不能提供确定性。相关的依赖时间属性的操作作包括:窗口聚合、Interval Join、Temporal Join 等,另一个典型的操作是 Lookup Join,语义上是类似基于处理时间的 Temporal Join,访问的外部表如存在更新,就会产生不确定性。

3.3. 基于 TTL 淘汰内部状态数据的不确定性


这也是典型的流式处理所特有的一种不确定性!由于数据流的“无边界性”,流计算引擎在处理双流 Join 、分组聚合这些场景时必须要在流上维持若干“状态”,随着的时间的推移,状态体积会不断地膨胀,所以必须要设置 TTL 在规定地时间内清理这些状态,这是流计算引擎必须进行的妥协。而清理 TTL 就会导致不确定性的产生,这几乎无法避免。

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

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

相关文章

Android compose入门demo

Android Compose 是 Android 的一个新 UI 工具包,用于构建原生 Android 应用。它基于 Kotlin 语言,并使用了现代化的声明式 UI 编程模型。Compose 的目标是提供一种更简洁、更灵活的方式来构建 Android UI,同时保持高性能。 下面是一个简单的…

Nginx基本操作

目录 引言 一、Nginx配置文件详解 (一)配置文件 (二)模块 二、全局配置文件 (一)关闭版本或修改版本 1.关闭版本号 2.修改版本信息 (二)修改启动的进程数 (三&…

JavaScript+PHP实现视频文件分片上传

摘要 视频文件分片上传,整体思路是利用JavaScript将文件切片,然后循环调用上传接口 upload.php 将切片上传到服务器。这样将由原来的一个大文件上传变为多个小文件同时上传,节省了上传时间,这就是文件分片上传的其中一个好处。 上…

神经网络系列---回归问题和分类问题

文章目录 回归问题和分类问题回归问题:分类问题:多分类问题:排序问题:自定义损失函数: 回归问题和分类问题 回归问题: 回归问题是一种预测连续数值输出的任务。在这种问题中,模型的目标是根据…

整理ArrayList和LinkedList中的方法

ArrayList 和 LinkedList 是 Java 中两种常用的列表(List)实现。它们提供了许多相同的方法,但由于内部实现的不同,这些方法的性能可能会有所不同。以下是一些常用的方法: 添加元素 add(E e): 在列表的末尾添加一个元…

【黑马程序员】2、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址:【黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2、TypeScript初体验 2.1 安装编译TS的工…

mysql数据库 - 统诉

1、DDL - 数据库操作 show databases; create database 数据库名 use 数据库名 select database() drop database 数据库名 2、DDL- 表操作 show tables; create table desc 表名 show create table 表名 alter table 表名 add/modify/change/rename drop table 表名 3、DML …

hbuilderx创建、运行uni-app

创建uni-app 在点击工具栏里的文件 -> 新建 -> 项目: 选择uni-app类型,输入工程名,选择模板,点击创建,即可成功创建。 uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还有一个重要模…

解决easyExcel模板填充时转义字符\{xxx\}失效

正常我们在使用easyExcel进行模板填充时,定义的变量会填充好对应的实际数据,未定义的变量会被清空,但是如果这个未定义的变量其实是模板的一部分,那么清空了就出错了。 在这张图里,上面的是模板填充后导出的文件&…

Guitar Pro8.2吉他软件2024中文版功能特点介绍

Guitar Pro 8.2是一款功能强大的吉他乐谱软件,专为吉他手、音乐制作人和音乐爱好者设计。它提供了丰富的功能,帮助用户轻松创建、编辑、打印和分享吉他乐谱。以下是Guitar Pro 8.2的主要功能特点: Guitar Pro 2024 win-安装包下载如下&#x…

Java开发手册

技术栈 数据库 事务 概念 一组操作,要么都执行,要么都不执行 原理 事务提交后,发生变更的数据先更新到Buffer Pool缓冲区里,然后再合适的时机再持久化到磁盘为了防止持久化过程中数据库宕机,导致数据丢失&#xf…

MATLAB中,如何捕获和处理异常?如何在MATLAB中自定义错误消息?在MATLAB中,error函数和warning函数有什么区别?

MATLAB中,如何捕获和处理异常? 在MATLAB中,捕获和处理异常通常使用try-catch语句。try块包含可能引发异常的代码,而catch块则包含当异常发生时执行的代码。以下是如何在MATLAB中捕获和处理异常的基本步骤: 使用try关键…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示,某园区部署OSPF实现网络互通,其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址,在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后,R1通过转换后的…

DFS排列组合问题

文章目录 DFS排列组合问题排列组合问题的标准模板排列LeetCode46全排列题目描述代码 LeetCode47全排列Ⅱ题目描述代码 组合LeetCode77组合题目描述代码 LeetCode39组合总和题目描述代码 LeetCode40组合总和Ⅱ题目描述代码 LeetCode216组合总和Ⅲ题目描述代码 DFS排列组合问题 …

【鸿蒙开发】第十四章 Stage模型应用组件-任务Mission

1 任务(Mission)管理场景 任务(Mission)管理相关的基本概念如下: AbilityRecord:系统服务侧管理一个UIAbility实例的最小单元,对应一个应用侧的UIAbility组件实例。系统服务侧管理UIAbility实例数量上限为512个。 Mi…

Day2 JS基础

2.1 运算符 赋值运算符 一元运算符 -- <script>let h20let kh hconsole.log(h) //22console.log(k) //42let i1console.log(i i i) //7 ​// 递增运算符&#xff1a;var a8aconsole.log(a) //9 ​var num10var bnumconsole.log(b) //10</script> 比较运…

C++面试:CPU的上下文切换、中断处理与系统调度

目录 一、上下文切换&#xff08;Context Switching&#xff09; 1. 切换基础 2. 减少切换 使用线程池 使用异步编程 使用共享内存 二、中断处理&#xff08;Interrupt Handling&#xff09; 中断基础 中断发生过程 三、系统调度&#xff08;Scheduling&#xff09; …

Code-Audit(代码审计)习题记录6-7

介绍&#xff1a; 自己懒得搭建靶场了&#xff0c;靶场地址是 GitHub - CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges为了方便在公网练习&#xff0c;可以随地访问&#xff0c;本文所有的题目均来源于网站HSCSEC-Code Audit 6、习题6 题目内容如下&#xff1a; 源代…

探索水下低光照图像检测性能,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建海底生物检测识别分析系统

海底这类特殊数据场景下的检测模型开发相对来说比较少&#xff0c;在前面的博文中也有一些涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《尝试探索水下目标检测&#xff0c;基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBA…

【数据结构(顺序表)】

一、什么是数据结构? 数据结构是由“数据”和“结构”两词组合而来。 什么是数据&#xff1f;常见的数值1、2、3、4.....、教务系统里保存的用户信息&#xff08;姓名、性别、年龄、学历等等&#xff09;、网页里肉眼可以看到的信息&#xff08;文字、图片、视频等等&#xff…