【重点】Flink四大基石

1. Time(时间机制)

时间概念

  • 处理时间:执行具体操作时的机器时间(例如 Java的 System.currentTimeMillis()) )
  • 事件时间:数据本身携带的时间,事件产生时的时间。
  • 摄入时间:数据进入 Flink 的时间;在系统内部,会把它当做事件时间来处理。

事件时间在实际应用中更为广泛,从Flink 1.12版本开始,Flink已经将事件时间作为默认的时间语义

Flink 可以根据不同的时间概念处理数据。

2. Window(窗口计算)

收集窗口时间内的数据,对窗口中收集数据进行聚合运算这就是窗口机制

窗口的生命周期

创建:属于该窗口的第一个元素到达时就会创建该窗口,窗口事先定义好就是固定的,但是窗口创建时间不固定【窗口开始时间以水印所携带的时间戳作为标准】

销毁:窗口结束时间之后,就会销毁当前窗口

Flink窗口分类以及窗口 API

Watermark处理乱序数据

3. State(状态机制)

什么是Flink的状态

状态其实是个变量,这个变量保存了数据流的历史数据, 如果有新的数据流进来,会读取状态变量,将新的数据和历史一起计算。

状态分类

托管状态(Managed State)和原始状态(Raw State)

托管状态就是由 Flink 统一管理的,状态的存储访问、故障恢复和重组等一系列问题都由Flink实现,直接使用API

原始状态则是自定义的,相当于就是开辟了一块内存,需要自己管理,实现状态的序列化和故障恢复。

通常采用 Flink 托管状态来实现需求

算子状态(Operator State)和按键分区状态(Keyed State)

可以将托管状态分为两类:算子状态和按键分区状态。

keyBy 将DataStream转换为KeyedStream,KeyedStream是特殊的DataStream。

KeyedState只能应用于KeyedStream,因此KeyedState的计算只能放在KeyBy之后

基于状态(KeyedState)计算实现词频统计

代码实现

事先定义一个实体类:

public class WordCount {private String word;private Integer count;// setter&getter&toString方法
}  

Flink程序基本流程:

/*** description: 基于状态(KeyedState)计算实现词频统计*/
public class WordCountWithStateful {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();DataStream<String> lines =env.socketTextStream("127.0.0.1",8888,"\n");lines.flatMap((String input, Collector<WordCount> output)-> {String[] words = input.split(" ");for(String word:words) {output.collect(new WordCount(word,1));}}).returns(WordCount.class)// keyBy之后,每个key都有对应的状态,同一个key只能操作自己对应的状态.keyBy(WordCount::getWord)// 状态计算.flatMap(new WordCountStateFunc()).print();env.execute();}
}

计算函数:

public class WordCountStateFunc extends RichFlatMapFunction<WordCount, WordCount> {/*** 状态变量*/private ValueState<WordCount> keyedState;/*** description: open方法中状态变量的初始化*/@Overridepublic void open(Configuration parameters) throws Exception {ValueStateDescriptor<WordCount> valueStateDescriptor =// valueState描述器new ValueStateDescriptor<>(// 描述器的名称"wordcountState",/* * 描述器的数据类型:** Flink有自己的一套数据类型,包含了JAVA和Scala的所有数据类型* 这些数据类型都是TypeInformation对象的子类。* TypeInformation对象统一了所有数据类型的序列化实现*/TypeInformation.of(WordCount.class));keyedState = getRuntimeContext().getState(valueStateDescriptor);}/*** description: keyedState计算逻辑*/@Overridepublic void flatMap(WordCount input, Collector<WordCount> output) throws Exception {// 读取状态WordCount lastKeyedState = keyedState.value();// 更新状态if (lastKeyedState == null) {// 状态还未赋值的情况 更新状态keyedState.update(input);// 返回原数据output.collect(input);} else {// 状态存在旧的状态数据的情况Integer count = lastKeyedState.getCount() + input.getCount();WordCount newWordCount = new WordCount(input.getWord(), count);// 更新状态keyedState.update(newWordCount);// 返回新的数据output.collect(newWordCount);}}}

keyedState状态计算步骤

  1. 继承Rich函数
  2. 重写Open方法,对状态变量进行初始化
  3. 状态计算逻辑

为什么要进行有状态的计算 ?

如果Flink发生了异常退出,checkpoint机制可以读取保存的状态,进行恢复。

广播流、广播状态

有时希望算子并行子任务都保持同一份“全局”状态,用来做统一的配置和规则设定。这时所有分区的所有数据都会访问到同一个状态,状态就像被“广播”到所有分区一样,这种特殊的算子状态,就叫作广播状态(BroadcastState)。【可以动态修改配置】

编码步骤

  1. 构建事件流
  2. 构建广播流
  3. 将事件流和广播流连接
  4. 对连接后的流进行处理

状态后端

Flink中,状态的存储、访问以及维护,都是由一个可插拔的组件决定的,这个组件就叫作状态后端(state backend)。状态后端主要负责管理本地状态的存储方式和位置。

  1. Memory State Backend 【java内存HashMap】
  2. FS State Backend 【HDFS】
  3. RocksDB State Backend 【可持久化的key value存储引擎】

选择正确的状态后端

HashMapStateBackend 是内存计算读写速度非常快;但是,状态的大小到集群可用内存的限制,如果应用的状态随着时间不停地增长,就会耗尽内存资源。

RocksDB 是硬盘存储,可以根据可用的磁盘空间进行扩展,所以它非常适合于超级海量状态的存储。不过由于每个状态的读写都需要做序列化/反序列化,而且可能需要直接从磁盘读取数据,这就会导致性能的降低,平均读写性能要比HashMapStateBackend慢一个数量级

空间和时间的抉择

4. Checkpoint(容错机制)

什么是Checkpoint(检查点)

Checkpoint能生成快照(Snapshot)
若Flink程序崩溃,重新运行程序时可以有选择地从这些快照进行恢复
Checkpoint是Flink可靠性的基石

Checkpoint和State的区别

State指某个算子的数据状态(中间状态),Checkpoint指所有算子的数据状态(全局快照)
State保存在堆内存,Checkpoint持久化保存

Checkpoint分布式快照流程(重点)

水用挡板挡停让水静止,进行快照存储;Checkpoint机制也是如此,Checkpoint Barrier类似挡板

步骤一

Source子任务收到了Checkpoint请求,该算子会对自己的数据状态保存快照向自己的下一个算子发送Checkpoint Barrier
下一个算子只有收到上一个算子广播过来的Checkpoint Barrier,才进行快照保存

步骤二

Sink算子已经收到了所有上游的Checkpoint Barrier时,进行以下2步操作:
1.保存自己的数据状态,2.并直接通知检查点协调器
检查点协调器在收集所有的task通知后,就认为这次的Checkpoint全局完成了,从而进行持久化操作

Checkpoint如何保证数据的一致性(重点)

至少一次(at-least-once)

发生故障,可能会有重复数据

精确一次(exactly-once)

发生故障,能保证不丢失数据,也没有重复数据

读取最近一次存放的快照,数据重放重新计算,Checkpoint机制保证exactly-once

Checkpoint Barrier对齐机制

Barrie对齐机制保证了Checkpoint数据状态的精确一致

下游算子上面对应多个上游算子,下游算子必须要等到上游算子所有的Checkpoint Barrier到齐之后,下游算子才会进行快照的输入。(会把先到的Checkpoint Barrier数据先缓存起来,直到所有的Checkpoint Barrier全部到达,该算子才会进行快照操作

什么是savepoint(保存点)

基于checkpoint机制的快照

Checkpoint和Savepoint区别
Checkpoint是自动容错恢复机制,Savepoint某个时间点的全局状态镜像
Checkpoint是Flink系统行为,Savepoint是用户触发
Checkpoint默认程序删除,Savepoint会一直保存

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

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

相关文章

代码随想录算法训练营第四十六天 _ 动态规划_198.打家劫舍、213.打家劫舍II、337.打家劫舍 III。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 198.打家劫舍 动态规划五步曲&a…

Python面向对象基础

Python面向对象基础 一、概念1.1面向对象的设计思想1.2 面向过程和面向对象1.2.1 面向过程1.2.2 面向对象1.2.3 面向过程和面向对象的优缺点 二、类和对象2.1 概念2.2 类的定义2.3 对象的创建2.3.1 类中未定义构造函数2.3.2 类中定义构造函数 2.4 类的设计 三、类中的成员3.1 变…

vue文件下载

第一种方法 const downloadfile (url) > {if (!url) {return ElMessage.error("暂无文件&#xff01;无法下载")}axios({url,method: GET,responseType: blob// headers: {// token:getCache(TOKEN), // 可以携带token// }}).then(res > {const href …

go-zero 开发入门-API服务开发示例

接口定义 定义 API 接口文件 接口文件 add.api 的内容如下&#xff1a; syntax "v1"info (title: "API 接口文件示例"desc: "演示如何编写 API 接口文件"author: "一见"date: "2023年12月07日"version: "…

Python教程-数组

作为软件开发者&#xff0c;我们总是努力编写干净、简洁、高效的代码。在本文中&#xff0c;我们将探索 Python 数组的各种特性和功能。我们将学习如何在 Python 中创建、操作和使用数组&#xff0c;以及数组与 Python 编程语言中的其他数据结构有何不同。我们的目标是提供有关…

找重复的数据(一维数组)

在一大堆数据中找出重复的是一件经常要做的事情。现在&#xff0c;我们要处理许多整数&#xff0c;在这些整数中&#xff0c;可能存在重复的数据。 你要写一个程序来做这件事情&#xff0c;读入数据&#xff0c;检查是否有重复的数据。如果有&#xff0c;输出“YES”这三个字母…

资源文件、布局管理器、样式表拓展

QT 资源文件 提供了和本地路径无关的资源管理。 图片资源的获取&#xff1a;阿里巴巴矢量图库&#xff08;&#x1f448; 安全链接&#xff0c;放心跳转&#xff09; widget.ui .qrc widget.h #ifndef WIDGET_H #define WIDGET_H#include <QtWidgets>namespace Ui { c…

Plonky2 = Plonk + FRI

Plonky2由Polygon Zero团队开发&#xff0c;实现了一种快速的递归SNARK&#xff0c;据其团队公开的基准测试&#xff0c;2020年&#xff0c;以太坊第一笔递归证明需要60s生成&#xff0c;而于今Plonky2在 MacBook Pro上生成只需 170 毫秒。 下面将逐步剖析Plonky2。 整体构造 …

活久见—当设置不同坐标系统时,ArcMap中的图形相关位置关系会变化

这两天一件十分神奇的事情发生了&#xff1a;当设置不同坐标系统时&#xff0c;ArcMap中的图形相对位置关系会变化。 事情起因是这样的&#xff1a;博主和同行用ArcMap同时验证2个相邻多边形的相对位置关系&#xff0c;见下图图1和图2的多边形&#xff0c;在博主的ArcMap中&am…

大电流H桥电机驱动电路的设计与解析(包括自举电路的讲解,以IR2104+LR7843为例)

大电流H桥电机驱动电路的设计与解析&#xff08;包括自举电路的讲解&#xff0c;以IR2104LR7843为例&#xff09; 电机驱动板主要采用两种驱动芯片&#xff0c;一种是全桥驱动&#xff08;如&#xff1a;HIP4082&#xff09;&#xff0c;一种是半桥驱动&#xff08;如&#xff…

单片机语言--C51语言的数据类型以及存储类型以及一些基本运算

C51语言 本文主要涉及C51语言的一些基本知识&#xff0c;比如C51语言的数据类型以及存储类型以及一些基本运算。 文章目录 C51语言一、 C51与标准C的比较二、 C51语言中的数据类型与存储类型2.1、C51的扩展数据类型2.2、数据存储类型 三、 C51的基本运算3.1 算术运算符3.2 逻辑…

奇数位字符反转算法

题目描述&#xff1a; 题目描述 编写函数void oddReverse(char *s),将所有奇数位的字符反转。输入格式 输入一个字符串 s保证输入字符串 s 的长度大于等于1小于等于100输出格式 输出修改后的字符串 s。输入样例1 012345输出样例1 052341输入样例2 01234输出样例2 03214输入样例…

Pycharm Jupyter ModuleNotFoundError 问题解决

Pycharm Jupyter ModuleNotFoundError 问题解决 0. 问题描述1. 解决方法 0. 问题描述 通过 Pycharm 启动的 Jypyter&#xff0c;发生 ModuleNotFoundError 的问题。 实际上相关 Module 已经通过 pip install 安装完成&#xff0c;所以怀疑是 Jupyter 的问题。 1. 解决方法 …

什么是HTML以及超链接,特殊符号转义的简单使用

目录 什么是HTML&#x1f338; HTML版本 版本说明&#x1f338; XHTML和HTML的区别 超链接&#x1f338;基本语法&#x1f338;链接的分类 特殊符号 什么是HTML HTML 不是编程语言&#xff0c;没有逻辑处理能力&#xff0c;没有计算能力&#xff0c;不能动态地生成内容&#x…

docker学习(七、搭建mysql8.2主从)

一、主库搭建 1.构建主库镜像 # 运行mysql镜像&#xff0c;配置端口3307为主库 docker run -p 3307:3306 --name mysql-master --privilegedtrue -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc…

前端:HTML+CSS+JavaScript实现轮播图2

前端&#xff1a;HTMLCSSJavaScript实现轮播图2 1. 和之前版本的区别2. 实现原理3. 针对上述的改进3. 参考代码 1. 和之前版本的区别 之前发布的那篇关于轮播图的文章在这&#xff1a;前端&#xff1a;HTMLCSSJavaScript实现轮播图&#xff0c;只能说存在问题吧&#xff01;比…

HuggingFace学习笔记--Prompt-Tuning、P-Tuning和Prefix-Tuning高效微调

1--Prompt-Tuning 1-1--Prompt-Tuning介绍 Prompt-Tuning 高效微调只会训练新增的Prompt的表示层&#xff0c;模型的其余参数全部固定&#xff1b; 新增的 Prompt 内容可以分为 Hard Prompt 和 Soft Prompt 两类&#xff1b; Soft prompt 通常指的是一种较为宽泛或模糊的提示&…

搭乘“低代码”快车,引领食品行业数字化转型全新升级

数字化技术作为重塑传统行业重要的力量&#xff0c;正以不可逆转的趋势改变着企业经营与客户消费的方式。 在近些年的企业数字化服务与交流过程中&#xff0c;织信团队切实感受到大多数企业经营者们从怀疑到犹豫再到焦虑最终转为坚定的态度转变。 在这场数字化转型的竞赛中&a…

VS2009和VS2022的错误列表可复制粘贴为表格

在VS2019或VS2022中&#xff0c;可看到如下错误列表&#xff1a; 如果复制这两行错误信息&#xff1a; 然后把它粘贴到word文件&#xff0c;就可以看到以下表格&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0020 未定义标识符 "dd"…

0基础学java-day16-(坦克大战[1])

一、 坦克大战游戏演示 1 游戏演示 2.为什么写这个项目 3.写项目前的提醒 二、java 绘图坐标体系 1 坐标体系-介绍 2 坐标体系-像素 3 介绍-快速入门 package com.hspedu.draw;import javax.swing.*; import java.awt.*;/*** author 林然* version 1.0* 演示如何在面板画圆…