欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

统一批处理流处理——Flink批流一体实现原理

程序员文章站 2022-06-29 10:56:38
实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的MapReduce,Hive,Spark等等。这些都是处理有限数据流的经典方式。而Flink专注的是无限流处理,那么他是怎么做到批处理的呢? 无限流处理:输入数据没有尽头;数据处理从当前或者过去的某一个时间 点开始,持续不停地进 ......

统一批处理流处理——Flink批流一体实现原理

实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的mapreduce,hive,spark等等。这些都是处理有限数据流的经典方式。而flink专注的是无限流处理,那么他是怎么做到批处理的呢?

统一批处理流处理——Flink批流一体实现原理

无限流处理:输入数据没有尽头;数据处理从当前或者过去的某一个时间 点开始,持续不停地进行

另一种处理形式叫作有限流处理,即从某一个时间点开始处理数据,然后在另一个时间点结束。输入数据可能本身是有限的(即输入数据集并不会随着时间增长),也可能出于分析的目的被人为地设定为有限集(即只分析某一个时间段内的事件)。

统一批处理流处理——Flink批流一体实现原理

显然,有限流处理是无限流处理的一种特殊情况,它只不过在某个时间点停止而已。此外,如果计算结果不在执行过程中连续生成,而仅在末尾处生成一次,那就是批处理(分批处理数据)。

批处理是流处理的一种非常特殊的情况。在流处理中,我们为数据定义滑 动窗口或滚动窗口,并且在每次窗口滑动或滚动时生成结果。批处理则不同,我们定义一个全局窗口,所有的记录都属于同一个窗口。举例来说, 以下代码表示一个简单的flink 程序,它负责每小时对某网站的访问者计数,并按照地区分组。

val counts = visits   
.keyby("region")   
.timewindow(time.hours(1))   
.sum("visits")

如果知道输入数据是有限的,则可以通过以下代码实现批处理。

val counts = visits   
.keyby("region")   
.window(globalwindows.create)   
.trigger(endoftimetrigger.create)   
.sum("visits")

flink 的不寻常之处在于,它既可以将数据当作无限流来处理,也可以将它当作有限流来处理。flink 的 dataset api 就是专为批处理而生的,如下所示。

val counts = visits   
.groupby("region")   
.sum("visits")

如果输入数据是有限的,那么以上代码的运行结果将与前一段代码的相同, 但是它对于习惯使用批处理器的程序员来说更友好。

fink批处理模型

flink 通过一个底层引擎同时支持流处理和批处理

统一批处理流处理——Flink批流一体实现原理

在流处理引擎之上,flink 有以下机制:

  • 检查点机制和状态机制:用于实现容错、有状态的处理;

  • 水印机制:用于实现事件时钟;

  • 窗口和触发器:用于限制计算范围,并定义呈现结果的时间。

在同一个流处理引擎之上,flink 还存在另一套机制,用于实现高效的批处理。

  • 用于调度和恢复的回溯法:由 microsoft dryad 引入,现在几乎用于所有批处理器;
  • 用于散列和排序的特殊内存数据结构:可以在需要时,将一部分数据从内存溢出到硬盘上;
  • 优化器:尽可能地缩短生成结果的时间。

两套机制分别对应各自的api(datastream api 和 dataset api);在创建 flink 作业时,并不能通过将两者混合在一起来同时 利用 flink 的所有功能。

在最新的版本中,flink 支持两种关系型的 api,table api 和 sql。这两个 api 都是批处理和流处理统一的 api,这意味着在无边界的实时数据流和有边界的历史记录数据流上,关系型 api 会以相同的语义执行查询,并产生相同的结果。table api 和 sql 借助了 apache calcite 来进行查询的解析,校验以及优化。它们可以与 datastream 和 dataset api 无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。

table api / sql 正在以流批统一的方式成为分析型用例的主要 api。

datastream api 是数据驱动应用程序和数据管道的主要api。

从长远来看,datastream api应该通过有界数据流完全包含dataset api。

flink批处理性能

mapreduce、tez、spark 和 flink 在执行纯批处理任务时的性能比较。测试的批处理任务是 terasort 和分布式散列连接。

第一个任务是 terasort,即测量为 1tb 数据排序所用的时间。

terasort 本质上是分布式排序问题,它由以下几个阶 段组成:

(1) 读取阶段:从 hdfs 文件中读取数据分区;

(2) 本地排序阶段:对上述分区进行部分排序;

(3) 混洗阶段:将数据按照 key 重新分布到处理节点上;

(4) 终排序阶段:生成排序输出;

(5) 写入阶段:将排序后的分区写入 hdfs 文件。

统一批处理流处理——Flink批流一体实现原理

hadoop 发行版包含对 terasort 的实现,同样的实现也可以用于 tez,因为 tez 可以执行通过mapreduce api 编写的程序。spark 和 flink 的 terasort 实现由 dongwon kim 提供.用来测量的集群由 42 台机器组成,每台机器 包含 12 个 cpu 内核、24gb 内存,以及 6 块硬盘。

统一批处理流处理——Flink批流一体实现原理

结果显示,flink 的排序时间比其他所有系统都少。 mapreduce 用了2157 秒,tez 用了1887 秒,spark 用了2171 秒,flink 则 只用了 1480 秒。

第二个任务是一个大数据集(240gb)和一个小数据集(256mb)之间的分布式散列连接。结果显示,flink 仍然是速度最快的系统,它所用的时间分别是 tez 和 spark 的 1/2 和 1/4.

统一批处理流处理——Flink批流一体实现原理

产生以上结果的总体原因是,flink 的执行过程是基于流的,这意味着各个处理阶段有更多的重叠,并且混洗操作是流水线式的,因此磁盘访问操作更少。相反,mapreduce、tez 和 spark 是基于批的,这意味着数据在通过网络传输之前必须先被写入磁盘。该测试说明,在使用flink 时,系统空闲时间和磁盘访问操作更少。

值得一提的是,性能测试结果中的原始数值可能会因集群设置、配置和软件版本而异。

因此,flink 可以用同一个数据处理框架来处理无限数据流和有限数据流,并且不会牺牲性能。

更多flink相关文章:

穿梭时空的实时计算框架——flink对时间的处理

flink快速入门--安装与示例运行

大数据实时处理的王者-flink

flink,storm,sparkstreaming性能对比

更多实时计算,flink,kafka的技术文章欢迎关注实时流式计算

统一批处理流处理——Flink批流一体实现原理