《基于Apache Flink的流处理》读书笔记

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 前段时间详细地阅读了 **《Apache Flink的流处理》** 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细、全面得介绍了Flink流处理,并且以气象数据的例子讲解其中的使用,我把其中一些比较重要的句子做了比较,并且分享给大家。有一些我不是很理解,需要以后慢慢去消化,我就不做详细的展开。

        前段时间详细地阅读了 《Apache Flink的流处理》 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细、全面得介绍了Flink流处理,并且以气象数据的例子讲解其中的使用,我把其中一些比较重要的句子做了比较,并且分享给大家。有一些我不是很理解,需要以后慢慢去消化,我就不做详细的展开。

一、传统的数据处理框架

1.1事务型处理

        企业在日常业务运营过程中会用到各类基于web的应用,通常是业务系统,比如订单、客户系统等等
        通常一个应用对于1个或多个数据库,应用通过执行远程数据库系统的事务来读取或更新状态

1.2分析型处理

        存储于不同事务类型数据系统中的数据,可以为企业提供业务运营相关的分析见解,通常是将数据从业务系统的数据库中复制到数仓,然后再进行分析和查询。这个过程称为ETL。

二、Flink和Spark的区别

2.1共同点

        高吞吐、在压力下保持正确

2.2不同点:

         1.本质上,Spark是微批处理,而Flink是流处理
         2.Flink低延迟
         3.Flink支持时间语义,可通过WaterMark来处理乱序数据,如果Spark要处理乱序数据只能通过RDD排序来实现
         4.Flink支持状态编程,使用方式更加灵活
         5.Flink提供精确一次的状态一致性保障

2.3本质区别:

        本质上是流与微批的区别

2.4 数据模型:

        Spark采用RDD模型,Spark Streaming的DStream实际上也就是一组小批数据的RDD的集合
        Flink基本数据是流,以及事件Event序列

2.5运行架构:

        Spark是批计算,将DAG划分成不同的stage,一个完成后才可以计算下一个
        Flink是标准的流执行模式,一个事件在处理后可以直接发往下一个节点

三、Flink流处理基础

3.1DataFlow图

        描述了数据在不同操作之间流动。
        通常表现为有向图,顶点表现为算子,表示计算,边表示数据的依赖关系

3.2StreamGraph

        根据用户通过StreamAPI编写的代码生成的最初的图,由2部分构成:
         1.StreamNode,代表算子,表示计算
         2.StreamEdge:连接两个StreamNode的边,表示数据的依赖关系

3.3JobGraph

         StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构,由以下3个构成:
         1.JobVertex:经过优化后符合条件的多个StreamNode可能串联在一起生成1个JobVertex
         2.JobEdge:连接JobVertex,代表了JobGraph的依赖关系。
         3.IntermediateDataSet:经过JobVertex节点处理的数据输出

3.4ExecutionGraph

         JobGraph的并行版本,由JobManager生成,调度底层的核心数据结构

3.5物理执行图

        JobManager根据ExecutionGraph对Job进行调度,在TaskManager上部署后形成的图,并不是一个数据结构

四、算子状态

4.1本地变量

        单个算子同一并行度子任务可以访问,其余都不行

4.2算子状态(Operator State)

        算子状态的作用范围限定为算子任务
        由同一个算子同一并行的子任务所处理的所有数据都可以访问到相同的状态
        状态对于同一子任务而言是共享的
        算子状态不能由相同或不同算子的另一个子任务访问
主要有3种:
        ListState:将状态表示为一组数据的列表
        Union List State:也是ListState,区别在从savepoint或者checkpoint启动时如何恢复
        BroadCast State:广播状态

4.3键控状态(Keyed State)

        键控状态是根据输入数据流中定义的键(key)来维护和访问的
        key相同的数据所能访问的状态
        KeyedState只能在键控流中使用
主要有4种:
        ValueState:将状态表示为单个的值
        ListState:将状态表示为一组数据的列表
        MapState:将状态表示为一组 Key-Value 对
        ReducingState:将状态表示为一个用于聚合操作的列表

4.3状态后端:把算子状态写到存储系统

        为了保证状态的快速访问,每个并行的任务都会把状态存储在本地JVM,状态后端负责将任务状态以检查点的形式写入到远程持久化存储,该存储可能是一个分布式的文件系统,也可能是某个数据库系统

五.算子扩缩容

        算子主要有OperateState和KeyedState,他们的扩缩容方法不一样

5.1键控状态(KeyedState)

        KeyState发生重新分配后,key值分配到哪个Task上,则对应的KeyState也会分配到对应的Task上
        做法是:将Key值读取出来,Hash分配到KeyGroup上,KeyGroup的数量对应着重分区Task的数量,最后把KeyGroup分配到对应的Task上。

5.2算子状态OperatorState

        ListState:把所有状态的ListState收集起来,均匀分配给新的任务
        Union List State:将List收集起来,广播到全部的任务,由任务决定去留
        BrodCastState:广播状态都一样,直接拷贝到新的任务上

六、窗口

6.1时间窗口

        有滚动、滑动、会话三种

6.1.1滚动窗口:Tumbling Windows

        将数据依据固定的窗口长度对数据进行切分
        时间对齐,窗口长度固定,没有重叠

6.1.2滑动窗口:Sliding Windows

        滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成
        窗口长度固定,可以有重叠

6.1.3会话窗口(Session Windows)

        一段时间没有接收到新数据就会生成新的窗口,消息之间的间隔小于超时阈值(sessionGap)的,则被分配到同一个窗口,间隔大于阈值的,则被分配到不同的窗口
        特点:时间无对齐

七、Flink组成

7.1JobManager

        控制单个应用程序的执行,包括接收要执行的应用JobGraph和Jar文件、将JobGraph转化成ExecutionGraph、向ResourceManager申请资源启动TaskManager、分发应用给TaskManager执行、检查点CheckPoint工作

7.2ResourceManager

        向集群资源提供者申请资源、释放资源

7.3TaskManager

         1.注册Slot
         2.启动任务

7.3Dispatcher

         1.启动JobMaster
         2.提供REST应用查询

八、高可用性

         1.依赖Zookeeper来完成
                 1.1.活跃状态的JobManager将JobGraph和Jar的路径写到Zookeeper中
                 1.2.将CheckPoint的路径写入Zookeeper中
         2.应用恢复,当活跃的JobManager发生故障,其下的应用都会取消
                 2.1新接手的JobManager请求Zookeeper,获取JobGraph和Jar文件以及CheckPoint
                 2.2重启应用

九、数据传输

         1.在算子处理完数据后,为了不造成太大的网络压力,不会马上发送,会先收集到缓冲区中,以批次形式发送
         2.每个TaskManager都有网络缓冲池,用于不同机器数据传输
         3.如果接收端和发送端位于同一台机器内,序列化先放入缓冲区,缓冲区完毕放到队列中,接收任务获取数据再反序列化
         4.如果发送端和接收端不在同一个机器,放入缓存后,先发送到TaskManager的网络缓冲池中,再进行发送

十、WaterMark

        特殊的数据记录,必须单调递增
        处理乱序事件,正确处理乱序事件,通常用WaterMark结合Windows实现
        当时间戳达到窗口关闭时间,不应该立即触发窗口计算,等待一段时间,等待延迟再关闭窗口

        水位线分配策略
                周期性:以固定事件间隔来发出水位线并且推动事件前进。默认间隔为200毫秒
                        AssignerWithPeriodicWatermarks
                定点水位线分配:根据输入事件的属性来生成水位线
                        AssignerWithPunctuatedWatermarks

十一、Flink检查点算法

        基于Chandy-Lamport分布式快照算法来实现
        该算法不会暂停整个应用,而是会把任务处理和检查点分离,这样在部分任务持久化状态过程中,其他任务还可以继续执行。
         检查点的原理步骤:
         1.由JobManager向Source数据源任务生成一个新的检查点编号,Source算子接收到信息后,暂停发出记录,利用状态后端触发生成本地状态检查点,状态后端保存完检查点后通知任务,随后任务向JobManager发送确认信息,随后恢复正常工作,然后生成特殊的CheckPoint Barrier记录,以广播的形式发送到下游任务。
         2.当下游Transform算子接收到新的检查点分割符号,会暂停处理并且缓存当前流的数据,等待接收其他分区的检查点分隔符,所有分隔符到达后,通知状态后端生成检查点,保存通知JobManager后,向下游发送检查点分隔符CheckPoint Barrier后,继续处理数据。
         3.Sink算子接收到分隔符后依次等待分隔符到齐后,生成快照并且写入检查点,向JobManager确认。
         4.当JobManager确认已接受所有应用任务返回检查点确认消息后,将此次检查点标记为完成。

十二、Flink算子

12.1基本操作

         1.map 对每个元素应用函数返回新的结果
         2.filter 给出给定的条件过滤数据
         3.flatMap 转换类似map,对每个输入产生零个、一个或多个输出事件,事实可以看作filter和map的泛化

12.2KeyedStream

        从逻辑上将事件按照键值分配到多条独立的子流中
         1.keyBy:指定的键值将一个DataStream转化为KeyedStream
         2.滚动聚合:滚动聚合作用与KeyedStream上,它将生成一个包含聚合结果的DataStream,主要操作有:sum、min、max、minBy、maxBy
         3.Reduce:滚动聚合的泛化,它将一个ReduceFunction应用在一个KeyedStream上,每个到来的事件都会和Reduce结果进行一次组合,从而产生一个新的DataStream

12.3多流转换

        将多条流联合起来处理,或将一条流分割成多条流以应用不同逻辑。
        Union:合并两条或多条类型相同的DataStream,生成一条新的类型相同的DataStream
        Connect:接收一个DataStream并返回一个ConnectedStream对象
        Split和Select:union转换的你操作。将输入流分割成2条或多条类型和输入流相同的输出流。

12.4分发转换

        在使用DataStream API构建应用时,系统会根据操作语义和配置的并行度自动选择数据分区策略并且数据转发到正确的目标,返回的是DataStream。
        shuffle:随机数据交换策略:均匀的分布随机将记录发往后继算子的并行任务
        rebalence:轮流,将输入流中的事件以轮流的方式均匀地分配给后继任务
        rescale:重调,轮流对事件进行分发,单局限于部分后继任务(一个Stream会指定1个或多个Stream均匀分发,而不是对所有Stream均匀分发),当接收端任务远大于发送端任务有效
        broadcast:广播,将输入流的事件复制并发往下游算子
        grobal:将输入流中的所有事件发往下游算子的第一个并行任务

十三、KeyedProcessFunction

         作用于KeyedStream上,使用非常灵活,该函数会针对流中每条记录调用一次,实现了RichFunction接口,支持了open、close、getRuntimeContext,等方法,它还会提供以下2个方法
         processElement:会针对流中每条记录都调用一次
         onTimer:回调函数,注册的计时器触发时被调用

十四、触发器

        决定了什么时候窗口准备就绪,触发计算,每个窗口都会分配默认的Trigger。比如EventTime的EventTimerTrigger,ProcessingTime的ProcessingTimeTrigger。
        需要继承Trigger抽象类
                onElement:在窗口中没进入一条数据时调用
                onProcessingTime:根据ProcessingTime判断是否满足定时器的条件调用
                onEventTime:根据窗口最新的EventTime判断是否满足定时器的条件
                clear:在窗口清除时调用
        前3个方法都会返回TriggerResult,其中包含了4个枚举值
                CONTINUE:表示窗口不执行任何操作。即不触发窗口计算,也不删除元素
                FIRE:触发窗口的计算,单保留窗口元素
                PURGE:不触发窗口计算,丢弃窗口,并且删除窗口元素
                FIRE_AND_PURGE:触发窗口计算,输入结果,并且清楚窗口数据

十五、基于时间的双流Join

15.1基于间隔的Join

        基于时间的Join会对两条流中拥有相同键值以及彼此之间时间戳不超过某一指定间隔的的事件进行Join
        也就是它只支持事件语义以及INNER JOIN
        基于间隔的Join需要同时对双流的记录进行缓冲,缓冲的依据是配置的between时间戳,有2个变量,一个是下界,为负值,一个是上界,为正值。对于第一条流来说,时间戳大于当前水位线减去间隔上界的数据都会被缓存起来,对于第二条流而言,所有时间戳大于当前水位线加上间隔下界的数据都会被缓存起来。

15.2基于窗口的Join

        基于窗口的Join原理是:将两条流输入流中的元素分配到公共窗口中并且在窗口完成时进行Join。具体的做法是:通过窗口分配器将2条流中的事件分配到公共的窗口内。当公共的窗口触发计算时,算子会遍历2个输入中元素的每个组合去调用JoinFunction。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
10天前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。
|
24天前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
91 2
|
2天前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
144 31
Apache Flink 流批融合技术介绍
|
26天前
|
数据采集 分布式计算 Kubernetes
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
39 4
|
20天前
|
Java 微服务 Spring
驾驭复杂性:Spring Cloud在微服务构建中的决胜法则
【8月更文挑战第31天】Spring Cloud是在Spring Framework基础上打造的微服务解决方案,提供服务发现、配置管理、消息路由等功能,适用于构建复杂的微服务架构。本文介绍如何利用Spring Cloud搭建微服务,包括Eureka服务发现、Config Server配置管理和Zuul API网关等组件的配置与使用。通过Spring Cloud,可实现快速开发、自动化配置,并提升系统的伸缩性和容错性,尽管仍需面对分布式事务等挑战,但其强大的社区支持有助于解决问题。
32 0
|
20天前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
35 0
|
23天前
|
消息中间件 数据挖掘 Kafka
揭秘大数据时代的极速王者!Flink:颠覆性流处理引擎,让实时数据分析燃爆你的想象力!
【8月更文挑战第29天】Apache Flink 是一个高性能的分布式流处理框架,适用于高吞吐量和低延迟的实时数据处理。它采用统一执行引擎处理有界和无界数据流,具备精确状态管理和灵活窗口操作等特性。Flink 支持毫秒级处理和广泛生态集成,但学习曲线较陡峭,社区相对较小。通过实时日志分析示例,我们展示了如何利用 Flink 从 Kafka 中读取数据并进行词频统计,体现了其强大功能和灵活性。
28 0
|
26天前
|
消息中间件 Java 数据处理
揭秘Apache Flink的Exactly-Once神技:如何在数据流海中确保每条信息精准无误,不丢不重?
【8月更文挑战第26天】Apache Flink 是一款先进的流处理框架,其核心特性 Exactly-Once 语义保证了数据处理的精准无误。尤其在金融及电商等高要求场景下,该特性极为关键。本文深入解析 Flink 如何实现 Exactly-Once 语义:通过状态管理确保中间结果可靠存储;利用一致的检查点机制定期保存状态快照;以及通过精确的状态恢复避免数据重复处理或丢失。最后,提供一个 Java 示例,展示如何计算用户访问次数,并确保 Exactly-Once 语义的应用。
43 0
|
SQL 架构师 API
《Apache Flink 知其然,知其所以然》系列视频课程
# 课程简介 目前在我的公众号新推出了《Apache Flink 知其然,知其所以然》的系列视频课程。在内容上会先对Flink整体架构和所适用的场景做一个基础介绍,让你对Flink有一个整体的认识!然后对核心概念进行详细介绍,让你深入了解流计算中一些核心术语的含义,然后对Flink 各个层面的API,如 SQL/Table&DataStreamAPI/PythonAPI 进行详细的介绍,以及
1346 0
《Apache Flink 知其然,知其所以然》系列视频课程
|
26天前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
31 1

推荐镜像

更多