~~~~~~~~ 前段时间详细地阅读了 《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本地变量
~~~~~~~~ 单个算子同一并行度子任务可以访问,其余都不行