批处理:一种特殊的流处理

无限流处理:输入数据没有尽头;数据处理从当前或者过去的某一个时间点开始,持续不停地进行。
有限流处理:即从某一个时间点开始处理数据,然后在另一个时间点结束。
显然,有限流处理是无限流处理的一种特殊情况,它只不过在某个时间点停止而已。
如果计算结果不在执行过程中连续生成,而仅在末尾处生成一次,那就是批处理(分批处理数据)。
《Flink基础教程》。

1
2
3
4
val counts = visits
.keyBy("region")
.timeWindow(Time.hours(1))
.sum("visits")
1
2
3
4
5
6
7
8
9
val counts = visits
.keyBy("region")
.window(GlobalWindows.create)
.trigger(EndOfTimeTrigger.create)
.sum("visits")

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

批处理技术

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

 同样的后端(流处理引擎)被用来处理有限数据和无限数据。在流处理引擎之上,Flink有以下机制:

  1. 检查点机制和状态机制:用于实现容错、有状态的处理;
  2. 水印机制:用于实现事件时钟;
  3. 窗口和触发器:用于限制计算范围,并定义呈现结果的时间。
  4. 在同一个流处理引擎之上,Flink还存在另一套机制,用于实现高效的批处理。

 批处理重点:

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

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

 Apache Beam社区已经创建出了同时适用于流处理和批处理的API,它可以生成用于执行的Flink程序。

Flink作为批处理器

  1. 读取阶段:从HDFS文件中读取数据分区;
  2. 本地排序阶段:对上述分区进行部分排序;
  3. 混洗阶段:将数据按照key重新分布到处理节点上;
  4. 终排序阶段:生成排序输出;
  5. 写入阶段:将排序后的分区写入HDFS文件。

 分布式排序的处理阶段。
image

 Hadoop发行版包含对TeraSort的实现,同样的实现也可以用于Tez,因为Tez可以执行通过MapReduce API编写的程序。
 Spark和Flink的TeraSort实现由Dongwon Kim提供。

terasort

 MapReduce、Tez和Spark是基于批的,这意味着数据在通过网络传输之前必须先被写入磁盘。
 Flink的执行过程是基于流的,这意味着各个处理阶段有更多的重叠,并且混洗操作是流水线式的,因此磁盘访问操作更少。

【完】

GitHub flink-training-exercises
GitHub sql-training
本文知识来源于书本,仅供快速浏览学习,勿盲目转载
GitHub flink-training-course/课程表(持续更新)

邵志鹏 wechat
扫一扫上面的二维码关注我的公众号
0%