Flink流批一体计算(2):Flink关键特性

news2024/11/23 10:37:49

目录

流式处理

丰富的状态管理

流处理 

自定义时间流处理

有状态流处理 

通过状态快照实现的容错 


流式处理

在自然环境中,数据的产生原本就是流式的。无论是来自 Web 服务器的事件数据,证券交易所的交易数据,还是来自工厂车间机器上的传感器数据,其数据都是流式的。Flink是高吞吐、高性能、低时延的实时流处理引擎,能够提供ms级时延处理能力。

无界流,程序必须持续不断地对到达的数据进行处理。批处理是有界数据流处理的范例。可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。

丰富的状态管理

Flink 是有状态的流处理,Flink算子是有状态的,如何处理一个事件可能取决于该事件之前所有事件数据的累积结果,流处理应用需要在一定时间内存储所接收到的事件或中间结果,以供后续某个时间点访问并进行后续处理。

Flink提供丰富的状态管理,包括多种基础状态类型、丰富的State BackendState可以存储在内存上或RocksDB等上,并支持异步以及增量的Checkpoint机制、精确一次语义等等。

Flink 应用程序的状态访问都在本地进行,因为这有助于其提高吞吐量和降低延迟。通常情况下 Flink 应用程序都是将状态存储在 JVM 堆上,但如果状态太大,我们也可以选择将其以结构化数据格式存储在高速磁盘中。

流处理应用需要在一定时间内存储所接收到的事件或中间结果,以供后续某个时间点访问并进行后续处理。Flink提供了丰富的状态管理相关的特性支持,其中包括

  • 多种基础状态类型:Flink提供了多种不同数据结构的状态支持,如ValueState、ListState、MapState等。用户可以基于业务模型选择最高效、合适状态类型。
  • 丰富的State Backend:State Backend负责管理应用程序的状态,并根据需要进行Checkpoint。Flink提供了不同State Backend,State可以存储在内存上或RocksDB等上,并支持异步以及增量的Checkpoint机制。
  • 精确一次语义:Flink的Checkpoint和故障恢复能力保证了任务在故障发生前后的应用状态一致性,为某些特定的存储支持了事务型输出的功能,即使在发生故障的情况下,也能够保证精确一次的输出。

丰富的时间语义支持

时间是流处理应用的重要组成部分,对于实时流处理应用来说,基于时间语义的窗口聚合、检测、匹配等运算是非常常见的。Flink提供了丰富的时间语义支持。

  • Event-time:使用事件本身自带的时间戳进行计算,使乱序到达或延迟到达的事件处理变得更加简单。
  • Watermark支持:Flink引入Watermark概念,用以衡量事件时间的发展。Watermark也为平衡处理时延和数据完整性提供了灵活的保障。当处理带有Watermark的事件流时,在计算完成之后仍然有相关数据到达时,Flink提供了多种处理选项,如将数据重定向(side output)或更新之前完成的计算结果。
  • Processing-time和Ingestion-time支持。
  • 高度灵活的流式窗口支持:Flink能够支持时间窗口、计数窗口、会话窗口,以及数据驱动的自定义窗口,可以通过灵活的触发条件定制,实现复杂的流式计算模式。

容错机制

分布式系统,单个task或节点的崩溃或故障,往往会导致整个任务的失败。Flink提供了任务级别的容错机制,保证任务在异常发生时不会丢失用户数据,并且能够自动恢复。

  • Checkpoint:Flink基于Checkpoint实现容错,用户可以自定义对整个任务的Checkpoint策略,当任务出现失败时,可以将任务恢复到最近一次Checkpoint的状态,从数据源重发快照之后的数据。
  • Savepoint:一个Savepoint就是应用状态的一致性快照,Savepoint与Checkpoint机制相似,但Savepoint需要手动触发,Savepoint保证了任务在升级或迁移时,不丢失掉当前流应用的状态信息,便于任何时间点的任务暂停和恢复。

Flink SQL

Table APISQL借助了Apache Calcite来进行查询的解析,校验以及优化,可以与DataStreamDataSet API无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。简化数据分析、ETL等应用的定义。下面代码实例展示了如何使用Flink SQL语句定义一个会话点击量的计数应用。

SELECT userId, COUNT(*) 
FROM clicks 
GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId
  • CEP in SQL

Flink允许用户在SQL中表示CEPComplex Event Processing)查询结果以用于模式匹配,并在Flink上对事件流进行评估。

CEP SQL 通过MATCH_RECOGNIZESQL语法实现。MATCH_RECOGNIZE子句自Oracle Database 12c起由Oracle SQL支持,用于在SQL中表示事件模式匹配。CEP SQL使用举例如下:

SELECT T.aid, T.bid, T.cid

FROM MyTable

    MATCH_RECOGNIZE (

      PARTITION BY userid

      ORDER BY proctime

      MEASURES

        A.id AS aid,

        B.id AS bid,

        C.id AS cid

      PATTERN (A B C)

      DEFINE

        A AS name = 'a',

        B AS name = 'b',

        C AS name = 'c') AS T

流处理 

在自然环境中,数据的产生原本就是流式的。无论是来自 Web 服务器的事件数据,证券交易所的交易数据,还是来自工厂车间机器上的传感器数据,其数据都是流式的。但是当你分析数据时,可以围绕 有界流bounded)或 无界流unbounded)两种模型来组织处理数据,当然,选择不同的模型,程序的执行和处理方式也都会不同。

批处理是有界数据流处理的范例。在这种模式下,你可以选择在计算结果输出之前输入整个数据集,这也就意味着你可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。

流处理正相反,其涉及无界数据流。至少理论上来说,它的数据输入永远不会结束,因此程序必须持续不断地对到达的数据进行处理。

Flink 中,应用程序由用户自定义算子转换而来的流式 dataflows 所组成。这些流式 dataflows 形成了有向图,以一个或多个source开始,并以一个或多个sink结束。

通常,程序代码中的 transformation dataflow 中的算子(operator)之间是一一对应的。但有时也会出现一个 transformation 包含多个算子的情况,如上图所示。

Flink 应用程序可以消费来自消息队列或分布式日志这类流式数据源(例如 Apache Kafka Kinesis)的实时数据,也可以从各种的数据源中消费有界的历史数据。同样,Flink 应用程序生成的结果流也可以发送到各种sink中。

并行 Dataflows 

Flink 程序本质上是分布式并行程序。在程序执行期间,一个流有一个或多个流分区Stream Partition),每个算子有一个或多个算子子任务Operator Subtask)。每个子任务彼此独立,并在不同的线程中运行,或在不同的计算机或容器中运行。

算子子任务数就是其对应算子的并行度。在同一程序中,不同算子也可能具有不同的并行度。

Flink 算子之间可以通过一对一直传)模式或重新分发模式传输数据:

  • 一对一模式(例如上图中的 Source  map() 算子之间)可以保留元素的分区和顺序信息。这意味着 map() 算子的 subtask[1] 输入的数据以及其顺序与 Source 算子的 subtask[1] 输出的数据和顺序完全相同,即同一分区的数据只会进入到下游算子的同一分区。
  • 重新分发模式(例如上图中的 map()  keyBy/window 之间,以及 keyBy/window  Sink 之间)则会更改数据所在的流分区。当你在程序中选择使用不同的 transformation,每个算子子任务也会根据不同的 transformation 将数据发送到不同的目标子任务。例如以下这几种 transformation 和其对应分发数据的模式:keyBy()(通过散列键重新分区)、broadcast()(广播)或 rebalance()(随机重新分发)。在重新分发数据的过程中,元素只有在每对输出和输入子任务之间才能保留其之间的顺序信息(例如,keyBy/window  subtask[2] 接收到的 map()  subtask[1] 中的元素都是有序的)。因此,上图所示的 keyBy/window  Sink 算子之间数据的重新分发时,不同键(key)的聚合结果到达 Sink 的顺序是不确定的。

自定义时间流处理

对于大多数流数据处理应用程序而言,能够使用处理实时数据的代码重新处理历史数据并产生确定并一致的结果非常有价值。

在处理流式数据时,我们通常更需要关注事件本身发生的顺序而不是事件被传输以及处理的顺序,因为这能够帮助我们推理出一组事件(事件集合)是何时发生以及结束的。例如电子商务交易或金融交易中涉及到的事件集合。

为了满足上述这类的实时流处理场景,我们通常会使用记录在数据流中的事件时间的时间戳,而不是处理数据的机器时钟的时间戳。

有状态流处理 

Flink 中的算子可以是有状态的。这意味着如何处理一个事件可能取决于该事件之前所有事件数据的累积结果。Flink 中的状态不仅可以用于简单的场景(例如统计仪表板上每分钟显示的数据),也可以用于复杂的场景(例如训练作弊检测模型)。

Flink 应用程序可以在分布式群集上并行运行,其中每个算子的各个并行实例会在单独的线程中独立运行,并且通常情况下是会在不同的机器上运行。

有状态算子的并行实例组在存储其对应状态时通常是按照键(key)进行分片存储的。每个并行实例算子负责处理一组特定键的事件数据,并且这组键对应的状态会保存在本地。

如下图的 Flink 作业,其前三个算子的并行度为 2,最后一个 sink 算子的并行度为 1,其中第三个算子是有状态的,并且你可以看到第二个算子和第三个算子之间是全互联的(fully-connected),它们之间通过网络进行数据分发。通常情况下,实现这种类型的 Flink 程序是为了通过某些键对数据流进行分区,以便将需要一起处理的事件进行汇合,然后做统一计算处理。

Flink 应用程序的状态访问都在本地进行,因为这有助于其提高吞吐量和降低延迟。通常情况下 Flink 应用程序都是将状态存储在 JVM 堆上,但如果状态太大,我们也可以选择将其以结构化数据格式存储在高速磁盘中。

通过状态快照实现的容错 

通过状态快照和流重放两种方式的组合,Flink 能够提供可容错的,精确一次计算的语义。这些状态快照在执行时会获取并存储分布式 pipeline 中整体的状态,它会将数据源中消费数据的偏移量记录下来,并将整个 job graph 中算子获取到该数据(记录的偏移量对应的数据)时的状态记录并存储下来。当发生故障时,Flink 作业会恢复上次存储的状态,重置数据源从状态中记录的上次消费的偏移量开始重新进行消费处理。而且状态快照在执行时会异步获取状态并存储,并不会阻塞正在进行的数据处理逻辑。

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

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

相关文章

优先级队列建立小根堆来解决前K个高频元素(TOP K问题)

目录 场景一:解决前K个高频元素需要解决如下几个问题: 优先级队列PriorityQueue 堆的定义 题目链接 场景二:亿万级数据取前TOP K / 后TOP K 数据 场景一:解决前K个高频元素需要解决如下几个问题: 1.记录每一个元…

【C++】4.工具:读取ini配置信息

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍读取ini配置信息。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&…

医院PACS系统的发展历史

PACS全称Picture Archivingand Communication Systems。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,X光机,红外仪、显微仪等设备产生的图像)通过各…

【工程应用八】终极的基于形状匹配方案解决(小模型+预生成模型+无效边缘去除+多尺度+各项异性+最小组件尺寸)...

我估摸着这个应该是关于形状匹配或者模版匹配的最后一篇文章了,其实大概是2个多月前这些东西都已经弄完了,只是一直静不下来心整理文章,提醒一点,这篇文章后续可能会有多次修改(但不会重新发文章,而是在后台直接修改或…

【MySQL 日志管理、备份与恢复】

目录 一、数据库备份的分类1、从物理与逻辑的角度1.1、物理备份: 对数据库操作系统的物理文件(如数据文件,日志文件等)的备份1.2、逻辑备份 2、从数据库的备份策略角度3、常见的备份方法3.1、物理冷备3.2、专用备份工具mysqldump 或者 mysqlh…

【Windows系统】windows服务

概述 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服…

C++算法:多源最短路径(Floyd)

文章目录 前言一、Floyd算法二、代码实现总结 前言 前文单源最短路径Dijkstra中我们讨论了如何解决有向无环图的最短路径问题,Dijkstra只能解决一个起始点的问题,如果要解决每个顶点到任一顶点的最短路径呢?一个方法就是再循环一次&#xff…

ASEMI代理光宝高速光耦LTV-60L规格,LTV-60L封装

编辑-Z LTV-60L参数描述: 型号:LTV-60L 封装:LSOP-6 储存温度TST:-55~125℃ 工作温度TA:-40~105℃ 隔离电压VISO:5000VRMS 电源电压VCC:7V 平均正向输入电流IF:20mA 输入功…

电脑滤镜软件哪个好 滤镜调色有什么技巧

无论是图片还是视频,滤镜的作用都很大,通过滤镜改变色彩,能让图片或视频增加故事性和美感。电脑滤镜软件哪个好, 电脑滤镜软件有很多,这里我们主要介绍几款视频滤镜软件。滤镜调色有什么技巧?有模板的,我们…

api-hook,更轻量的接口测试工具

目录 前言 现状 api-hook优势 研发介绍 最后 前言 api-hook是一种轻量级的接口测试工具,它基于Python语言编写,可以通过配置文件定义接口测试用例,支持HTTP和HTTPS协议,并提供了灵活的校验机制和数据处理方式。 在网站的开发过…

Tailwindcss 入门

Tailwindcss 是一个功能类优先的 CSS 框架,通过 flex, pt-4, text-center 和 rotate-90 这种原子类组合快速构建网站,而不需要离开你的 HTML。就是记住原子类,不要再自己想 CSS 命名一股脑子写 HTMl 就行了! 它与常规的 Bootstra…

佩戴舒适度极好的蓝牙耳机推荐,久戴不累的蓝牙耳机推荐

无论是在日常还是运动的场景下,我们通常都会选择佩戴着耳机,让我们能够释放压力,缓解枯燥的生活。可是,随着市面上的蓝牙耳机层出不穷、各种各样,导致很多小伙伴不知如何选购耳机了,下面我来给大家分享几款…

循踪讲述:成都的夜,有一盏灯为你亮

成都的夜晚总是这样,热闹而梦幻。霓虹灯下的酒吧一条街,你看着手里冒着蒸汽的小龙虾,却心里想着那个人。那个曾经一起在脚手架上挥汗如雨,携手走过平淡岁月,然后在灯红酒绿的生活里逐渐远离的人。 他,一个手…

【数据治理-06】做好数据分类分级,为数据安全有序流动保驾护航

我们常说人以类聚,物以群分,确实是这样,杜威说过“所有知识都是分类”!很好理解,分类是认知经济,任何有效分类,都可以极大地节省我们的认知精力。数据分类分级具体说来,其实包含了2个…

欢迎来到 VOXEL WARS!

Sandbox Streams 的全新节目,我们希望你们能参与其中! 我们正在寻找 15 名 Voxedit 艺术家,他们将需要抽出 1 小时进行现场表演(仅限屏幕共享),并在节奏快速的环境中进行创作,以赢得“最佳快速设…

报道 | 7月国际运筹优化会议汇总

七月召开会议汇总: 30th International Annual EurOMA Conference Location:Leuven Important dates: Conference: July 3, 2023 - July 5, 2023 Details:https://euroma2023.org/ The Equilibrium Computation Workshop at EC Location:Kings College London…

STM32速成笔记—ADC

文章目录 一、什么是ADC二、ADC的用途三、STM32F103ZET6的ADC3.1 ADC通道对应引脚3.2ADC时钟3.3 ADC工作模式3.4 ADC转换时间3.5 ADC校准3.6 ADC转换结果与实际电压的换算 四、ADC配置步骤五、ADC配置程序5.1 ADC初始化程序5.2 软件触发AD转换5.3 读取AD转换结果 六、实战项目6…

运动健身APP开发需要具备哪些功能?

想要开发一款运动健身APP软件,需要具备哪些功能呢? 1、用户注册和登录:用户通过个人信息注册健身APP,登陆之后建立个人账号,以后使用秩序登录自己的账号就可以记录和追踪自己的健身计划和成果。 2、个人…

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

🏆🏆时间过的真快,这是导师回顾新星计划学习的第六篇文章! 最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。 🏆&#x1…

机器学习:问题构建及框架化

机器学习作为一种解决方案,并不是“万金油”,它只适用于一些特定的场景。在实际应用中,我们首先需要进行问题构建——即通过分析问题以隔离需要解决的各个元素的过程。问题构建有助于确定项目的技术可行性,并提供一组明确的目标和…