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

实现批处理的技术许许多多,从各种关系型数据库的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 可以用同一个数据处理框架来处理无限数据流和有限数据流,并且不会牺牲性能。
更多Flink相关文章:
Flink,Storm,SparkStreaming性能对比
更多实时计算,Flink,Kafka的技术文章欢迎关注实时流式计算

统一批处理流处理——Flink批流一体实现原理的更多相关文章
- 《基于Apache Flink的流处理》读书笔记
前段时间详细地阅读了 <Apache Flink的流处理> 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细.全面得介 ...
- 阿里重磅开源全球首个批流一体机器学习平台Alink,Blink功能已全部贡献至Flink
11月28日,Flink Forward Asia 2019 在北京国家会议中心召开,阿里在会上发布Flink 1.10版本功能前瞻,同时宣布基于Flink的机器学习算法平台Alink正式开源,这也是 ...
- Flink 是如何统一批流引擎的
关注公众号:大数据技术派,回复"资料",领取1000G资料. 本文首发于我的个人博客:Flink 是如何统一批流引擎的 2015 年,Flink 的作者就写了 Apache Fli ...
- DataPipeline CTO陈肃:构建批流一体数据融合平台的一致性语义保证
文 | 陈肃 DataPipelineCTO 交流微信 | datapipeline2018 本文完整PPT获取 | 关注公众号后,后台回复“陈肃” 首先,本文将从数据融合角度,谈一下DataPipe ...
- 最佳实践:Pulsar 为批流处理提供融合存储
非常荣幸有机会和大家分享一下 Apache Pulsar 怎样为批流处理提供融合的存储.希望今天的分享对做大数据处理的同学能有帮助和启发. 这次分享,主要分为四个部分: 介绍与其他消息系统相比, Ap ...
- Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)
本文由 网易云发布. 1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意.Flink是原生的流处理系统,提供high level的API.Flink也提 ...
- Apache 流框架 Flink,Spark Streaming,Storm对比分析(二)
本文由 网易云发布. 本文内容接上一篇Apache 流框架 Flink,Spark Streaming,Storm对比分析(一) 2.Spark Streaming架构及特性分析 2.1 基本架构 ...
- Apache 流框架 Flink,Spark Streaming,Storm对比分析(1)
此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意.Flink是 ...
- Flink在流处理上常见的Source和sink操作
flink在流处理上的source和在批处理上的source基本一致.大致有4大类 1.基于本地集合的source(Collection-based-source) 2.基于文件的source(Fil ...
随机推荐
- Spring Boot 中如何配置 Profile
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- Java生鲜电商平台-App系统架构开发与设计
Java生鲜电商平台-App系统架构开发与设计 说明:阅读此文,你可以学习到以下的技术分享 1.Java生鲜电商平台-App架构设计经验谈:接口的设计2.Java生鲜电商平台-App架构设计经验谈:技 ...
- oracle 利用序列与触发器实现列自增
实现步骤:先创建序列,后创建触发器 1.创建序列 create sequence 序列名 increment start maxvalue ; 2.创建触发器 create or replace tr ...
- 装上这 10 个插件,你就是这条 Gai 最靓的仔!
直奔主题,给大家推荐 10 个好用的插件. 1.「Adblock Plus」 世界排名第一的免费广告拦截程序 相信大家都有这样的体验,进某个论坛.新闻或者购物网站,广告满天飞,关掉之后还时不时弹出 ...
- Shodan搜索引擎在信息搜集中的应用
Shodan搜索引擎在信息搜集中的应用 作者:王宇阳 时间:2019-06-07 soudan(搜蛋),通过互联网后的通道来搜索信息:Google通过网址搜索互联网,shodan搜索互联网的在线.指定 ...
- 8.智能快递柜SDK(联网型锁板)
1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...
- Vue实战狗尾草博客管理平台第六章
Vue实现狗尾草博客后台管理系统第六章 本章节内容 文章列表 文章详情 草稿箱 文章发布. 本章节内容呢,开发的很是随意哈,因为多数就是element-ui的使用,熟悉的童鞋,是可以很快完成本章节的内 ...
- [PHP] 存储改造中的逻辑和清理遗留的问题
现象:用户读信时,根据路径的哈希结果,访问四台服务器中一台请求文件,这四台缓存机器已经下线,访问不到再去后端存储访问浪费了时间 前因:每一封信都是一个文件,存储在公司内部的分布式文件系统s3上.因为读 ...
- CodeForces - 1255D (模拟+构造+贪心)
题意 https://vjudge.net/problem/CodeForces-1255D rxc的农场里'R'表示有米,现在有K只鸡,给这k只鸡选一些格子,每个鸡可以有多个格子(每个鸡至少吃一个米 ...
- 各种windows10下的快捷键
Windows键+ctrl+D 创建虚拟桌面 windows键+Ctrl+方向键 可以切换桌面 windows+tab ctrl+alt+TAB 切换应用 windows+[1-9] 打开任务栏固定的 ...