批处理的技术有很多,从各种关系型数据库的SQL处理,到大数据领域的MapReduce、Hive、Spark等。这些都是处理有限数据流的经典方法。而Flink专注于无限流处理,那么他是如何实现批处理的呢?无限流处理:输入数据没有尽头;数据处理从当前或过去的某个时间点开始,并继续进行另一个处理的形式称为有限流处理,其中数据的处理从一个时间点开始,到另一个时间点结束。输入数据可能是有限的(即输入数据集不随时间增长),也可能人为设置为有限集以供分析之用(即只分析某段时间内的事件)。显然,有限流处理是无限流处理的特例,只是在某个时间点停止。另外,如果计算结果在执行过程中不是连续产生,而是最后只产生一次,就是批处理(批量处理数据)。批处理是流处理的一种非常特殊的情况。在流处理中,我们在数据上定义滑动或滚动窗口,并在每次窗口滑动或滚动时产生结果。批处理则不同,我们定义一个全局窗口,所有记录都属于同一个窗口。例如,以下代码表示一个简单的Flink程序,该程序按地区分组计算网站每小时的访问者数量。valcounts=visits.keyBy("region").timeWindow(Time.hours(1)).sum("visits")如果知道输入数据是有限的,可以通过下面的代码实现批处理。valcounts=visits.keyBy("region").window(GlobalWindows.create).trigger(EndOfTimeTrigger.create).sum("visits")Flink的不同寻常之处在于它既可以将数据视为无限流,也可以也被视为有限流。Flink的DataSetAPI是为批处理而设计的,如下图。valcounts=visits.groupBy("region").sum("visits")如果输入数据有限,上面代码的结果会和前面的代码一样,但是对于习惯了的程序员来说并不容易usingbatchprocessors说起来更友好。Fink批处理模型Flink通过底层引擎同时支持流处理和批处理。在流处理引擎之上,Flink有以下机制:Checkpoint机制和状态机制:用于容错、有状态的处理;水印机制:用于实现事件时钟;窗口和触发器:用于限制计算范围,并定义何时呈现结果。在同一个流处理引擎之上,Flink还有另外一种高效批处理的机制。Backtrackingforschedulingandrecovery:由MicrosoftDryad引入,现在几乎所有的批处理器都在使用;用于哈希和排序的特殊内存数据结构:可以在需要时将一部分数据从内存溢出到硬盘;优化器:尽可能减少生成结果的时间。两套机制分别对应各自的API(DataStreamAPI和DataSetAPI);在创建Flink作业时,将两者混合在一起是不可能同时利用Flink的所有功能的。在最新版本中,Flink支持两种关系型API,TableAPI和SQL。这两个API是批处理和流处理的统一API,也就是说在无界的实时数据流和有界的历史记录数据流上,关系型API会执行相同语义的查询,产生相同的结果。表API和SQL依赖ApacheCalcite进行查询解析、验证和优化。它们与DataStream和DataSetAPI无缝集成,并支持用户定义的标量函数、聚合函数和表值函数。TableAPI/SQL正在以流批统一的方式成为分析用例的主要API。DataStreamAPI是数据驱动应用程序和数据管道的主要API。从长远来看,DataStreamAPI应该通过有界数据流完全包含DataSetAPI。FlinkBatchPerformanceMapReduce、Tez、Spark和Flink在执行纯批处理任务时的性能对比。测试的批处理任务是TeraSort和DistributedHashJoin。第一个任务是TeraSort,它测量对1TB数据进行排序所需的时间。TeraSort本质上是一个分布式排序问题,由以下几个阶段组成:(1)读取阶段:从HDFS文件中读取数据分区;(2)局部排序阶段:对上述分区进行部分排序;(3)Shuffling阶段:根据key将数据重新分配给处理节点;(4)最终排序阶段:生成排序输出;(5)写入阶段:将排序好的分区写入HDFS文件。Hadoop发行版包括TeraSort的实现,同样的实现也可以用于Tez,因为Tez可以执行通过MapReduceAPI编写的程序。Spark和Flink的TeraSort实现由DongwonKim提供。用于测量的集群由42台机器组成,每台机器包含12个CPU内核、24GB内存和6个硬盘。结果表明,Flink比所有其他系统花费更少的时间进行排序。MapReduce用了2157秒,Tez用了1887秒,Spark用了2171秒,Flink只用了1480秒。第二个任务是大型数据集(240GB)和小型数据集(256MB)之间的分布式哈希连接。结果表明,Flink仍然是最快的系统,分别花费了Tez和Spark的1/2和1/4的时间。造成以上结果的总体原因是Flink的执行过程是基于流的,这意味着处理阶段之间有更多的重叠,并且shuffle操作是流水线化的,因此磁盘访问操作更少。相比之下,MapReduce、Tez和Spark是基于批处理的,这意味着数据必须先写入磁盘,然后才能通过网络传输。本次测试表明,使用Flink时,系统空闲时间和磁盘访问操作较少。值得一提的是,性能测试结果中的原始数字可能因集群设置、配置和软件版本而异。因此,Flink可以使用相同的数据处理框架来处理无限和有限的数据流,而不会牺牲性能。
