关于Flink:Flink是如何支持批流一体的

37次阅读

共计 2358 个字符,预计需要花费 6 分钟才能阅读完成。

实现批处理的技术许许多多,从各种关系型数据库的 sql 解决,到大数据畛域的 MapReduce,Hive,Spark 等等。这些都是解决无限数据流的经典形式。而 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 还存在另一套机制,用于实现高效的批处理。

用于调度和复原的回溯法:由 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 文件。

Hadoop 发行版蕴含对 TeraSort 的实现,同样的实现也能够用于 Tez,因为 Tez 能够执行通过 MapReduce API 编写的程序。Spark 和 Flink 的 TeraSort 实现由 Dongwon Kim 提供. 用来测量的集群由 42 台机器组成,每台机器 蕴含 12 个 CPU 内核、24GB 内存,以及 6 块硬盘。

结果显示,Flink 的排序工夫比其余所有零碎都少。MapReduce 用了 2157 秒,Tez 用了 1887 秒,Spark 用了 2171 秒,Flink 则 只用了 1480 秒。

第二个工作是一个大数据集(240GB)和一个小数据集(256MB)之间的分布式散列连贯。结果显示,Flink 依然是速度最快的零碎,它所用的工夫别离是 Tez 和 Spark 的 1/2 和 1/4.

产生以上后果的总体起因是,Flink 的执行过程是基于流的,这意味着各个解决阶段有更多的重叠,并且混洗操作是流水线式的,因而磁盘拜访操作更少。相同,MapReduce、Tez 和 Spark 是基于批的,这意味着数据在通过网络传输之前必须先被写入磁盘。该测试阐明,在应用 Flink 时,零碎闲暇工夫和磁盘拜访操作更少。

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

因而,Flink 能够用同一个数据处理框架来解决有限数据流和无限数据流,并且不会就义性能。

正文完
 0