• 沒有找到結果。

第 5 章  有状态的计算

5.6  结论

在本章中,我们看到有状态的流处理如何改变了游戏规则。通过Flink 的检 查点机制,能够同时实现容错、高吞吐和低延迟。这完全避免了人们曾经 认为无法避免的权衡,并体现了Flink 最重要的一个优势。

Flink 的另一个优势是,它用同一种技术实现流处理和批处理,因此完全不 必再建一个批处理层。第6 章将简述 Flink 如何实现批处理。

图灵社区会员 ArthurWYS([email protected]) 专享 尊重版权

73

第 6 章

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

到目前为止,本书讨论的都是无限流处理,即从某个时间点开始,持续不 停地处理数据,如图6-1 所示。

无限流处理

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

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

74 | 第 6 章

有限流处理

图6-2:有限流处理:输入数据有头有尾;数据处理在一段时间后停止

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

批处理是流处理的一种非常特殊的情况。在流处理中,我们为数据定义滑 动窗口或滚动窗口,并且在每次窗口滑动或滚动时生成结果。批处理则不 同,我们定义一个全局窗口,所有的记录都属于同一个窗口。举例来说,

以下代码表示一个简单的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 就是专为批处理而生的,如下 所示。

批处理:一种特殊的流处理 | 75 val counts = visits

.groupBy("region") .sum("visits")

如果输入数据是有限的,那么以上代码的运行结果将与前一段代码的相同,

但是它对于习惯使用批处理器的程序员来说更友好。

6.1 批处理技术

从原则上说,批处理是一种特殊的流处理:当输入数据是有限的,并且只 需要得到最终结果时,对所有数据定义一个全局窗口并在窗口里进行计算 即可。但是,这样做的效率如何呢?

传统上,有限数据流由专用的批处理器处理;某些时候,它比流处理器更 高效。但是,在流处理器中整合高效、大规模的批处理所需的大部分优化 方案,是可行的做法。这正是Flink 所做的工作,而且这样做的效率很高。

流处理引擎 检查点、状态管理、

水印、窗口和触发器

用于调度和恢复的回 溯法、特殊内存数据 结构,以及查询优化

图6-3:Flink 通过一个底层引擎同时支持流处理和批处理

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

图灵社区会员 ArthurWYS([email protected]) 专享 尊重版权

76 | 第 6 章 DataSet API);在创建 Flink 作业时,并不能通过将两者混合在一起来同时 利用Flink 的所有功能。然而,这并不是问题。实际上,Flink 社区已经在 研究如何统一这两个API。Apache Beam 社区已经创建出了同时适用于流处 理和批处理的API,它可以生成用于执行的 Flink 程序。

6.2 案例研究:Flink作为批处理器

在2015 年的 Flink Forward 研讨会上,Dongwon Kim1展示了他所做的性能 测试。他对MapReduce、Tez、Spark 和 Flink 在执行纯批处理任务时的性能 做了比较。测试的批处理任务是TeraSort 和分布式散列连接。

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

典型的分布式排序阶段

磁盘

磁盘

磁盘

磁盘 节点 1

节点 2

读取 本地排序 混洗 终排序 写入

图6-4:分布式排序的处理阶段

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

图6-5 展示了测试结果。结果显示,Flink 的排序时间比其他所有系统都少。

MapReduce 用了 2157 秒,Tez 用了 1887 秒,Spark 用了 2171 秒,Flink 则 只用了1480 秒。

时间(秒)

图6-5:MapReduce、Tez、Spark 和 Flink 分别对应的 TeraSort 结果 注2: https://github.com/eastcirclek/terasort

78 | 第 6 章

第二个任务是一个大数据集(240GB)和一个小数据集(256MB)之间的 分布式散列连接。结果显示,Flink 仍然是速度最快的系统,它所用的时间 分别是Tez 和 Spark 的 1/2 和 1/4,如图 6-6 所示。

时间(秒)

图6-6:Tez、Spark 和 Flink 分别对应的散列连接结果

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

值得一提的是,性能测试结果中的原始数值可能会因集群设置、配置和软 件版本而异。如果现在再测试一遍,那么得到的数值的确可能不一样(上 述测试用到的软件版本分别是:Hadoop 2.7.1、Tez 0.7.0、Spark 1.5.1,以及 Flink 0.9.1,这些系统在如今都有了更新的版本)。本节的重点是,即使是 批处理器所擅长的任务,流处理器(Flink)在经过适当的优化后也仍然可 以表现得和批处理器(MapReduce、Tez 和 Spark)一样好,甚至更好。因 此,Flink 可以用同一个数据处理框架来处理无限数据流和有限数据流,并 且不会牺牲性能。

图灵社区会员 ArthurWYS([email protected]) 专享 尊重版权

79

附 录

其他资源

进一步使用 Flink

我们希望你已经跃跃欲试,并且准备好使用Flink 了。从哪里开始呢?答案 是Flink 的网站:https://flink.apache.org。该网站有“快速入门”指南,通 过例子教你如何使用Flink 摄取和分析维基百科的编辑日志。只需花几分 钟,你就可以开始编写你的第一个流处理程序了。

如果你偏爱视觉效果,可以看看MapR 公司提供的例子:如何用 Flink 摄取 纽约市出租车路线的数据流,并用Kibana 将它可视化,详见The Essential Guide to Streaming-first Processing with Apache Flink(https://www.mapr.com/

blog/essential-guide-streaming-first-processing-apache-flink)。

若想进行更深入的学习,可以访问data Artisans 免费提供的培训资源:http://

training.data-artisans.com。其上的所有幻灯片、练习和解决方案都是开源的。

关于时间和窗口的更多内容

本书用很大的篇幅讨论了时间和窗口的多个方面,并解释了Flink 的工作 原理以及在使用时可以做的选择。这些主题也是一系列博客文章所讨论的 内容。如果你想更深入地了解Flink 窗口的工作原理,可以参考 http://flink.

80 | 附录

apache.org/news/2015/12/04/Introducing-windows.html;若想了解关于会话窗 口的更多细节,可以参考 http://data-artisans.com/blog/session-windowing-in-flink/;若想进一步了解 Flink 窗口和水印机制,以及事件时间适用于哪些 应用程序,请参考 http://data-artisans.com/blog/how-apache-flink-enables-new-streaming-applications-part-1。

关于状态和检查点的更多内容

若想深入了解Flink 的检查点机制,以及它如何实现容错性流处理,请参 考 http://data-artisans.com/blog/high-throughput-low-latency-and-exactly-once-stream-processing-with-apache-flink。

若想了解关于保存点的更多信息,请观看这个短视频:https://mapr.com/

blog/savepoints-apache-flink-stream-processing-whiteboard-walkthrough/。在该 视频中,data Artisans 的首席技术官 Stephan Ewen 解释了如何用保存点重播 流数据。在重新处理数据、修复bug 和进行更新时,保存点很有用。

更 多 关 于 保 存 点 的 内 容, 请 参 考 http://data-artisans.com/blog/how-apache-flink-enables-new-streaming-applications/。

若想了解基于Yahoo! Streaming Benchmark 所做的拓展,请访问 https://data-artisans.com/blog/extending-the-yahoo-streaming-benchmark/。

用 Flink进行批处理

若想了解流处理器如何进行批处理,请访问 http://data-artisans.com/blog/batch-is-a-special-case-of-streaming。

Flink 博客上也有许多信息。若想深入了解 Flink 为了优化批处理而使用的 具体机制,请访问以下网址。

• http://flink.apache.org/news/2015/05/11/Juggling-with-Bits-and-Bytes.html

• http://flink.apache.org/news/2015/03/13/peeking-into-Apache-Flinks-Engine-Room.html

• http://data-artisans.com/blog/computing-recommendations-at-extreme-scale-with-apache-flink/

图灵社区会员 ArthurWYS([email protected]) 专享 尊重版权

其他资源 | 81

Flink用例和用户故事

经常使用Flink 的公司会发表一些文章,并在其中描述收获和用法。以下是 一些推荐的用户故事。

• https://techblog.king.com/rbea-scalable-real-time-analytics-king/

• https://tech.zalando.de/blog/apache-showdown-flink-vs.-spark/

• http://data-artisans.com/blog/flink-at-bouygues-html/

• http://data-artisans.com/blog/how-we-selected-apache-flink-at-otto-group/

人们每年在Flink Forward 研讨会上演示的视频和幻灯片,都是了解各个公 司如何使用Flink 的绝佳资源,详见 Flink Forward 的网站。

流处理架构

若想深入了解流处理架构,以及Kafka 和 MapR Streams 所用的消息传输技 术,推荐阅读Ted Dunning 和 Ellen Friedman 合著的书Streaming Architecture。

以下两个短视频解释了流处理架构在支持微服务方面的优势。

• https://www.mapr.com/blog/key-requirements-streaming-platforms-micro-services-advantage-whiteboard-walkthrough-part-1

• https://www.mapr.com/blog/streaming-data-how-move-state-flow-whiteboard-walkthrough-part-2

消息传输: Kafka

若想尝试使用Kafka,可以在 MapR 公司网站上的这篇博客文章里找到示例程 序:https://www.mapr.com/blog/getting-started-sample-programs-apache-kafka-09。

此外,推荐阅读由Neha Narkhede、Gwen Shapira 和 Todd Palino 合著的书

《Kafka 权威指南》1

注1: 详见 http://www.ituring.com.cn/book/2067。——编者注

82 | 附录

消息传输: MapR Streams

MapR Streams 是 MapR 融合数据平台的一个主要部分。要了解关于它的更 多内容,请参考下列资源。

• MapR Streams 的功能概览,包括流层面上的管理和跨地域的流复制能力:

https://www.mapr.com/products/mapr-streams。

• MapR Streams 的示例程序(用 Kafka API):https://www.mapr.com/blog/

getting-started-sample-programs-mapr-streams。

• 大致比较 Kafka 和 MapR Streams:https://mapr.com/blog/apache-kafka-and-mapr-streams-terms-techniques-and-new-designs。

图灵社区会员 ArthurWYS([email protected]) 专享 尊重版权

83

Ted Dunning和Ellen Friedman的部分著作

Streaming Architecture: New Designs Using Apache Kafka and MapR Streams

Sharing Big Data Safely: Managing Data Security

Real-World Hadoop

Time Series Databases: New Ways to Store and Access Data

Practical Machine Learning: A New Look at Anomaly Detection

Practical Machine Learning: Innovations in Recommendation

84

关于作者

埃伦弗里德曼(Ellen Friedman)既是解决方案咨询师,也是著名的演 讲者和作者。她目前的写作重点是大数据。此外,她还是Apache Drill 和 Apache Mahout 这两个项目的贡献者。她拥有生物化学博士学位,具有多年

埃伦弗里德曼(Ellen Friedman)既是解决方案咨询师,也是著名的演 讲者和作者。她目前的写作重点是大数据。此外,她还是Apache Drill 和 Apache Mahout 这两个项目的贡献者。她拥有生物化学博士学位,具有多年

相關文件