《基于Apache 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.3JobGraphStreamGraph经过优化后生成了JobGraph , 提交给JobManager的数据结构,由以下3个构成:         1.JobVertex:经过优化后符合条件的多个StreamNode可能串联在一起生成1个JobVertex         2.JobEdge:连接JobVertex,代表了JobGraph的依赖关系 。         3.IntermediateDataSet:经过JobVertex节点处理的数据输出
3.4ExecutionGraphJobGraph的并行版本 , 由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:将状态表示为一个用于聚合操作的列表

推荐阅读