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

简介: 前段时间详细地阅读了 **《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+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
2月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
485 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
370 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
2月前
|
存储 消息中间件 人工智能
云栖实录|实时计算 Flink 全新升级 - 全栈流处理平台助力实时智能
本文根据 2025 云栖大会演讲整理而成,演讲信息如下 演讲人:黄鹏程 阿里云智能集团计算平台事业部实时计算Flink版产品负责人
288 1
云栖实录|实时计算 Flink 全新升级 - 全栈流处理平台助力实时智能
|
3月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
1399 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
3月前
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
419 4
|
4月前
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
544 6
|
4月前
|
消息中间件 存储 Kafka
Apache Flink错误处理实战手册:2年生产环境调试经验总结
本文由 Ververica 客户成功经理 Naci Simsek 撰写,基于其在多个行业 Flink 项目中的实战经验,总结了 Apache Flink 生产环境中常见的三大典型问题及其解决方案。内容涵盖 Kafka 连接器迁移导致的状态管理问题、任务槽负载不均问题以及 Kryo 序列化引发的性能陷阱,旨在帮助企业开发者避免常见误区,提升实时流处理系统的稳定性与性能。
478 0
Apache Flink错误处理实战手册:2年生产环境调试经验总结
|
SQL 架构师 API
《Apache Flink 知其然,知其所以然》系列视频课程
# 课程简介 目前在我的公众号新推出了《Apache Flink 知其然,知其所以然》的系列视频课程。在内容上会先对Flink整体架构和所适用的场景做一个基础介绍,让你对Flink有一个整体的认识!然后对核心概念进行详细介绍,让你深入了解流计算中一些核心术语的含义,然后对Flink 各个层面的API,如 SQL/Table&DataStreamAPI/PythonAPI 进行详细的介绍,以及
1554 0
《Apache Flink 知其然,知其所以然》系列视频课程
|
4月前
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
628 9
Apache Flink:从实时数据分析到实时AI

推荐镜像

更多