Flink之时间语义

Flink之时间语义

简介

Flink中时间语义可以说是最重要的一个概念了,这里就说一下关于时间语义的机制,我们下看一下下面的表格,简单了解一下

时间定义
processing time处理时间,也就是现实世界的时间,或者说代码执行时,服务器的时间
event time事件时间,就是事件数据中所带的时间(业务意义上的时间),和现实世界中的时间无关,只以数据中所带的时间为准
ingestion time注入时间,也就是数据进入到Flink系统中最开始的那个时间,这个没什么用处.开发中使用的基本就是处理时间和事件时间.

通过表格中的内容我们对这三类时间代表的内容应该都清楚了,后面会先介绍一下时间语义的执行机制和对应的API使用.

机制

推进时间

何为"时间标记",其实这里说的"时间标记"就是Flink中的WaterMark,是由于Operator[算子]中的定时器决定的,我们先看下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpODY22p-1692338649652)(/Users/jinlong/data/Typora_WorkSpase/FlinkTImeSemantics/time1.png)]

图中我们是以event time为例子的,这样更便于理解

  1. 当数据从Mysql过来时,Operator中的定时器会先判断事件数据中所带的时间戳的大小
  2. 当得知事件数据中的时间戳是截止目前为止的最大时间戳时,会和时间标记进行比较,其实也就是和WaterMark进行比较,发现大于WaterMark时,就会将时间戳进行更换,如果小于怎么办?小于就证明这一条数据时迟到的数据,就会被抛弃(这是发生在1对1的情况下).
  3. 当时间标记更换完成后,就会将这个事件标记发送给下游算子.

推进时间选择

上面我们讲到了当时间标记更新完成后会发送给下游算子,试想一下如果下游的某个subtask接收的数据是上游的两个subtask发送来的数据时,且两条数据中的时间戳不同该怎么办?请看下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sZu7OCS-1692338649652)(/Users/jinlong/data/Typora_WorkSpase/FlinkTImeSemantics/time2.png)]

  1. Operator(subtask)这个算子实例,接收到了来自上游的两个推进时间300700
  2. 接收到之后首先判断出两个上游发送来的推进时间中的最小值,在图中也就是300
  3. 判断出最小推进时间后,再和算子实例中存在的推进时间进行比较,如果大于当前算子实例中的推进时间则进行替换
  4. 更新算子实例中的推进时间后,继续发送给下游

迟到数据

前面讲到了关于推进时间的更换和推进时间的选择,这里讲一下Flink中的迟到数据,什么是迟到数据?就是字面意思,来晚了.

比如说某个算子实例中的推进时间是1000,但是来了一条数据的时间是500,怎么办?这条数据会被舍弃掉,在使用Flink的时候我们要牢记一点未来尚可努力,过去不可更改,Flink中的时间线和现实世界中的时间线是一样的,只会推进永远不会回退,顶多在Flink中的时间可以暂停,但是一定一定是不可以回退的.

请看下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GnS6bAHg-1692338649653)(/Users/jinlong/data/Typora_WorkSpase/FlinkTImeSemantics/time3.png)]

  1. 首先当前算子实例还是会对推进时间进行判断,获取最新的推进时间(800)
  2. 当判断出推进时间为800时得知500~1000这个窗口还没有结束(窗口都是前闭后开)
  3. 接收上游发送来的数据,根据数据中的事件时间将其发送到不同的桶中,如800900的数据都符合当前桶(500~1000)的时间区间,那么就会将该数据分配到当前桶中,直到推进时间更新到1000时则开始计算当前桶中的数据
  4. 如果发现数据中的事件时间超出当前桶的时间区间,则会根据该数据中的时间时间划分未来桶,如10001200都属于1000~1500这个时间区间,假如这时来了一条1500 <= data < 2000的数据,这时又会划分出一个新的未来中,未来桶中的数据只要还没开始计算,就会一直这样划分下去.
  5. 700的数据来时,发现时间时间700小于当前算子实例中的推进时间800,则将700的数据抛弃, 虽然700的数据在500~1000的区间,但是时间遵循不可回退的原则,所以该条数据必然会被抛弃
  6. 将推进时间和计算完成的数据继续发往下游算子实例

推进时间暂停(即停止更新)

在Flink实时计算中还会出现一种情况,就是前面提到的,虽然时间不可回退,但是在Flink中可能会出现推进时间暂停的情况,这里就对这种情况进行说明,请看下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSnRCyjo-1692338649653)(/Users/jinlong/data/Typora_WorkSpase/FlinkTImeSemantics/time4.png)]

  1. 同样下游的算子实例在选择推进时间时,会选择两个上游算子实例发来的推进时间中较小的那一个作为更新当前算子实例中的推进时间依据
  2. 通过上图可知WaterMak800的这个算子实例不再有新的WaterMark发送过来,所以对于下游的算子实例来说,不管另一个持续发送WaterMark的算子实例时间推进到哪里都没有作用了,也就是对于下游的算子实例时间已经暂停在800
  3. 当下游的算子实例时间暂停后,上游其中一个算子实例还在源源不断的发送WaterMark和数据,这时在下游的算子实例的窗口中就会根据数据中的事件时间以500为一个区间不断地构建一个一个的未来桶,将这些数据先放起来
  4. 发生这种情况时,如果时间过长就可能会导致程序崩溃报错,那么是否有解决方式呢?当然是有的,在Flink中为我们提供了一种机制watermark-idle-timeout,这个机制的作用是什么呢?当侦测到某一个支线一直没有数据进来,并且超过了watermark-idle-timeout设置的时间(比如说是2s),那么这个机制就会将推进时间往前推进2s,也就是说当我们将这个机制设置为2s时,那等待某个一直没有来数据支线的时间就是2s,到达2s这个临界值时就会自动更新推进时间

关于时间语义的机制大概就这些内容了,如有不对欢迎指正,如有问题共同探讨.

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

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

相关文章

nginx代理webSocket链接响应403

一、场景 使用nginx代理webSocket链接&#xff0c;nginx响应403 1、nginx访问日志响应403 [18/Aug/2023:09:56:36 0800] "GET /FS_WEB_ASS/webim_api/socket/message HTTP/1.1" 403 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

【数据结构】循环队列

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

浏览器 - 事件循环机制详解

目录 1&#xff0c;浏览器进程模型进程线程浏览器的进程和线程1&#xff0c;浏览器进程2&#xff0c;网络进程3&#xff0c;渲染进程 2&#xff0c;渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3&#xff0c;常见面试题1&#xff0c;如何理解 js 的异步2&#x…

❤ Vue工作常用的一些动态数据和方法处理

❤ Vue工作常用的一些动态数据和方法处理 &#xff08;1&#xff09;动态拼接相对路径结尾的svg 错误写法一 ❌ 正确写法 &#x1f646; <img :src"require(/assets//amazon/svg/homemenu${index}.svg)" style"height: 20px;display: block;margin: 0 au…

关于视频监控平台EasyCVR视频汇聚平台建设“明厨亮灶”具体实施方案以及应用

一、方案背景 近几年来&#xff0c;餐饮行业的食品安全、食品卫生等新闻频频发生&#xff0c;比如某火锅店、某网红奶茶&#xff0c;食材以次充好、后厨卫生被爆堪忧&#xff0c;种种问题引起大众关注和热议。这些负面新闻不仅让餐饮门店的品牌口碑暴跌&#xff0c;附带的连锁…

[JavaWeb]【二】Vue Ajax Elemnet Vue路由打包部署

目录 一 什么是Vue 1.1 Vue快速入门 1.2 常用指令 1.2.1 v-bind && v-model 1.2.2 v-on 1.2.3 v-if && v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍 2.2 同步与异步 2.3 原生Ajax&#xff08;繁琐&#xff0c;过时了&#xff09…

手机技巧:分享五个非常实用的生活类APP

目录 1、我的桌面iScreen-桌面美化神器 2.Just Rain-创意听雨声APP 3.得言-美文句子神器 4、微手帐 5、暗盒-隐私保护神器 今天给大家整理5个非常实用的实用APP软件&#xff0c;感兴趣的朋友可以下载试试&#xff01; 1、我的桌面iScreen-桌面美化神器 我的桌面iScreen是一…

[uni-app] uview封装Popup组件,处理props及v-model的传值问题

文章目录 需求及效果遇到的问题解决的办法偷懒的写法 需求及效果 uView(1.x版本)中, 有Pop弹出层的组件, 现在有个需求是,进行简单封装,有些通用的设置不想每次都写(比如 :mask-custom-style"{background: rgba(0, 0, 0, 0.7)}"这种) 然后内部内容交给插槽去自己随…

系统架构设计专业技能 · 系统工程与系统性能

系列文章目录 系统架构设计专业技能 网络技术&#xff08;三&#xff09; 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 …

2023年上半年软件设计师下午真题及答案解析

试题一(15分) 随着农业领域科学种植的发展&#xff0c;需要对农业基地及农事进行信息化管理&#xff0c;为租户和农户等人员提供种植相关服务&#xff0c;现欲开发农事管理服务平台&#xff0c;其主要功能是&#xff1a; (1)人员管理&#xff1a;平台管理员管理租户&#xff…

​Redis概述

目录 Redis - 概述 使用场景 如何安装 Window 下安装 Linux 下安装 docker直接进行安装 下载Redis镜像 Redis启动检查常用命令 Redis - 概述 redis是一款高性能的开源NOSQL系列的非关系型数据库,Redis是用C语言开发的一个开源的高键值对(key value)数据库,官方提供测试…

python Requests

Requests概述 官方文档&#xff1a;http://cn.python-requests.org/zh_CN/latest/,Requests是python的HTTP的库&#xff0c;我们可以安全的使用 Requests安装 pip install Requests -i https://pypi.tuna.tsinghua.edu.cn/simple Requests的使用 Respose的属性 属性说明url响…

http学习笔记3

第 11 章 Web 的攻击技术 11.1 针对 Web 的攻击技术 简单的 HTTP 协议本身并不存在安全性问题&#xff0c;因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端&#xff0c;以及运行在服务器上的 Web 应用等资源才是攻击目标。目前&#xff0c;来自互联网的攻…

【汇编语言】CS、IP寄存器

文章目录 修改CS、IP的指令转移指令jmp问题分析 修改CS、IP的指令 理论&#xff1a;CPU执行何处的指令&#xff0c;取决于CS:IP应用&#xff1a;程序员可以通过改变CS、IP中的内容&#xff0c;进行控制CPU即将要执行的目标指令&#xff1b;问题&#xff1a;如何改变CS、IP中的…

Golang 基础语法问答

使用值为 nil 的 slice、map 会发生什么&#xff1f; 允许对值为 nil 的 slice 添加元素&#xff0c;但是对值为 nil 的 map 添加元素时会造成运行时 panic。 // map错误示例 func main() {var m map[string]intm["one"] 1 // error: panic: assignment to entry …

Python Opencv实践 - 图像均值滤波

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape) pixel_count img.shape[0] * img.shape[1] print(pixel_count)#为图像添加椒盐噪声 #参考资料&#xf…

基于YOLOX的输电线路异物检测算法研究及软件设计_有系统有文献,整体认知蛮好的

我国自改革开放以来&#xff0c;大力发展工业和经济&#xff0c;对电能同样有着巨大的需求&#xff0c;所需求的电能不仅需要保证其数量&#xff0c;还要保障其质量&#xff0c;因此对整个电力系统安全稳定的运行也提出了更高的要求&#xff0c;电力系统发生故障要实时检测并及…

Kafka—工作流程、如何保证消息可靠性

什么是kafka&#xff1f; 分布式事件流平台。希望不仅仅是存储数据&#xff0c;还能够数据存储、数据分析、数据集成等功能。消息队列&#xff08;把数据从一方发给另一方&#xff09;&#xff0c;消息生产好了但是消费方不一定准备好了&#xff08;读写不一致&#xff09;&am…

Vscode详细安装教程

Vscode官网下载 官网地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 通过链接可以直接跳转到下面的页面当中&#xff0c;支持的版本有Windows、Linux、Mac&#xff0c;可以选择适配自己电脑的版本&#xff0c;一般来说应该是Windows x64的。不要直接点W…

MySQL高级篇——MySQL架构篇1(Linux下MySQL8的安装与使用)

目录 0 安装前0.1 Linux系统及工具的准备0.2 查看是否安装过MySQL0.3 MySQL的卸载 1 MySQL8的Linux版安装1.1 MySQL的4大版本1.2 下载MySQL指定版本1.3 CentOS7下检查MySQL依赖1.4 CentOS7下MySQL安装过程 2 MySQL登录2.1 首次登录2.2 修改密码2.3 设置远程登录 3 MySQL 8 的密…