Flink:流上的“不确定性”(Non-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 就会导致不确定性的产生,这几乎无法避免。

4. 流上的“不确定性更新”(NDU)


流上的“不确定更新”特指流上的增量更新场景。我们知道,Flink SQL 基于“在动态表上的持续查询”将流式处理“映射”成了关系表操作。对于流上发生的各种更新,Flink SQL 必须要予以捕获并更新到所维持的表中,用官方文档中的话说就是:所有会产生增量消息的操作都必须要在 Flink 内部维护完整的状态数据!在 Flink 中,在整个查询管道(Pipeline,就是从 Source 到 Sink 的完整 DAG)都依赖于更新消息的正确投递(从上一下算子到下一个算子),而“不确定的更新”就会导致错误!

那到底什么是不确定更新呢?我们知道 Flink 使用 changelog 类型的消息来描述和传导更新,它包含这样几种类型:(I) INSERT,(D)DELETE,(-U)UPDATE_BEFORE,(+U)UPDATE_AFTER,对于 Insert-Only 类型的数据(也就是日志型数据)不存在不确定更新问题,这很容易理解,只有在包含 D/-U/+U 这类更新消息的场景下,才有可能会出现“不确定更新”问题,因为,此时,Flink 需要根据主键去更新对应的状态数据,这里涉及 Flink "如何确定主键” 的问题,Flink 的处理方式是:

  • 如果能推导出主键,就根据主键更新状态数据
  • 如果不能推导出主键,Flink 只能完整比对现有状态中维护的所有的行才能确定如何更新或删除。此时,消息不能被“不确定的列值”所干扰,否则就会出现“不确定性更新”错误了

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

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

相关文章

【查漏补缺你的Vue基础】Vue数据监听深度解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【rust】10 project、crate、mod、pub、use、项目目录层级组织、概念和实战

文章目录 一、项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用…

阿里Java开发手册(黄山版) LeetCode刷题手册 免费下载

目录 一、阿里Java开发手册(黄山版) 二、LeetCode刷题手册 三、获取方式 今天给大家推荐两个程序员的辅助利器!都是平时开发,刷算法能经常用到的书籍,怕百度云分享会失效,获取方式在最下面,永久有效。 一、阿里Jav…

C++ 反向迭代器的设计与实现

在本文开始之前,先明晰几个 关键词 的含义(T : 模板参数): Ref : T& / const T&Ptr : T* / const T* 一、反向迭代器设计的上帝视角 我们希望将 反向迭代器 设计成一种适配器——传 list::iterator 得到 list 的反向迭代…

嵌入式学习day28 Linux

1.进程间的通信: 1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 …

Lastools工具使用

Lastools工具使用 1、介绍 官网链接 常用的功能 las2las可以进行点云拼接las2txt可以将点云中的有效信息转换为txt文档(如xyz坐标)lasmerge可以将多个LAS/LAZ文件合并为一个文件Laszip将LAS文件高速压缩到LAZ而不会丢失信息las2text将LAS/LAZ转换为可…

数据库事务问题整理-MySQL

什么是数据库事务? 数据库事务( transaction)是访问并可能操作(增删改查都可能有)各种数据项的一个数据库操作序列(可能有1或多个SQL语句),这些操作要么全部执行,要么全部不执行,是一个不可分割…

C++初阶:模版相关知识的进阶内容(非类型模板参数、类模板的特化、模板的分离编译)

结束了常用容器的介绍,今天继续模版内容的讲解: 文章目录 1.非类型模版参数2.模板的特化2.1模版特化引入和概念2.2函数模版特化2.3类模板特化2.3.1全特化2.3.1偏特化 3. 模板分离编译3.1分离编译概念3.2**模板的分离编译**分析原因 1.非类型模版参数 模板…

设计模式(五)-观察者模式

前言 实际业务开发过程中,业务逻辑可能非常复杂,核心业务 N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成&…

如何在Linux系统Docker部署Wiki.js容器并结合内网穿透实现远程访问本地知识库

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上,我们都需要通过某种方式来有条理的组织相应的知识架构,那么一个好的知识整…

适用Java SpringBoot项目的分布式锁

在分布式系统中,常用到分布式锁,它有多中实现方式,如:基于redis,database,zookeeper等。Spring integration组件有这三种服务的分布式锁实现,今天来看看用的比较多的redis和database实现方式。 …

【EI会议征稿通知】2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024)

2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024) 2024 3rd International Conference on Biomedical and Intelligent Systems (IC-BIS 2024) 2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024) 将于2024年4月…

为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive 局限性问题: reactive本身存在一些局限性,可能会在开发过程中引发一些问题。这需要额外的注意力和处理,否则可能对开发造成麻烦。数据类型限制: reactive声明的数据类型仅限于对象,而…

Html零基础入门教程(非常详细)

文章目录 1.认识HTML2.html 框架3.HTML常见标签4.HTML语法特征5.列表 1.认识HTML html是超文本标记语言: 目前最新版本是html5,由w3c(万维网联盟)完成标准制定。 声明文档的类型是html5 超文本标记语言。 HTML ,全称“Hyper Text Markup Language(超文…

LNMP架构(搭建论坛+博客)

目录 一、LNMP架构概述 1、LNMP架构的概念 2、LNMP架构的优点 二、编译安装nginx软件 1、准备工作 1.1 关闭防火墙 1.2 安装依赖包 1.3 创建运行nginx用户 1.4 压缩包解压 2、编译与安装 3、添加nginx自启动文件 三、编译安装mysql软件 1、准备工作 1.1 安装mysq…

利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

JVM-堆

一、概念 堆是Java虚拟机内存结构中的一部分。通过new关键字创建的对象都会分配在堆中。堆中的对象是线程共享的,需要考虑线程安全问题,堆中有垃圾回收机制。 二、堆内存溢出 虽然堆中有垃圾回收机制,但是如果当堆中的数据都仍需要使用&am…

width:100%和width:auto有啥区别

项目中使用了with属性,突然好奇auto 和 100% 的区别,特地搜索实践总结了一下观点 一、 width属性介绍二、 代码带入三、 分析比较四、 总结 一、 width属性介绍 width 属性用于设置元素的宽度。width 默认设置内容区域的宽度,但如果 box-siz…

Vue3切换路由白屏刷新后才显示页面内容

1.首先检查页面路由以及页面路径配置是否配置错误。 在router-view 中给路由添加key标识。 !!注意:有使用layout封装布局的,是在layout下的主页面中的 router-view 添加标识,不是在src根目录下main.vue中修改&#xf…

基于vue-office实现docx、xlsx、pdf文件的在线预览

概述 在做项目的时候会遇到docx、xlsx、pdf等文件的在线预览需求,实现此需求可以有多种解决方式,本文基于vue-office实现纯前端的文件预览。 效果 如下图,分别为docx、xlsx、pdf三种类型的文件在线加载后的效果。你也可以访问官方预览网址…