09 Spark 与 Flink 对比

这篇总结来自极客时间专栏《大规模数据处理实践》的 21 节。

19-20 节的内容比较简单,是大数据处理常见的应用案例,这里不再介绍,总结一下 第 21 节的内容,其实如果对这块比较熟悉的话,这节的内容也是很容易接受的。

在前面几节中,介绍了 Spark 很多的内容,Spark 每个组件都是为了解决一些问题而诞生的,都是有具体的使用场景,并不是社区的那些人拍脑袋决定的,也正是因为这样,Spark 才成为当前最流行的大数据处理框架之一。

那么再来深入思考一下,Spark 有什么缺点?有什么场景是 Spark 无法解决的?(最好能从架构上去思考,外围的不足通过后天还可以弥补,但如果架构设计有缺陷,基本就回天乏力了

Flink 之所以能迅速发展起来,如果从竞争对手考虑,是有三个外部原因的:

  1. Storm:可以说 Storm 是流计算的鼻祖,但 Storm 从 trident 之后基本就没有特别重大的 feature,它没有去做到高阶 API、没有做 Table API 或 SQL,当 DataFlow 出来之后,也没有及时去跟进,Storm 真多错过了太多太多,可能跟 Storm 背后没有一家商业公司去驱动有关系,但历史并不会给落后者机会,错过了就是错过了;
  2. Spark:Spark Streaming 第一次让业内看到原来流也可以做准确性,也是很有跨时代意义的,但 Spark Streaming 从底层架构上就是批的思想,这样注定它无法做到完全的实时性,虽然 Structured Streaming 支持连续处理机制,但这个架构设计个人不看好,这也给了 Flink 切入的机会;
  3. DataFlow:Google 在 15/16 年开始向外界推广它的 DataFlow 模型,Flink 无疑是最接近这个模型的框架,但 Google 并没有将自己的框架开源,Google 本来可以做到更好。

既然 Spark 无法在流上做到更高的实时性,那么我们看下 Flink 是如何做的?

Flink 核心模型简介

Flink 中最核心的数据结构是 Stream,它表示一个运行在多个分区上的并行流。

在 Stream 上同样可以进行各种转换(transformation)操作,与 Spark RDD 不同的是,Stream 代表的是一个数据流,而非静态数据的集合,它包含的数据随时间增长而变化,而且 Stream 上的转换操作都是逐条进行的,这也决定了 Flink 的处理速度比 Spark Streaming 有更低的延迟。

当一个 Flink 程序执行的时候,它会被映射为 Streaming DataFlow,下图是一个示例:

Streaming DataFlow(图片来自极客时间课程)

一个 Streaming DataFlow 包含 Stream 和 Operator(操作符),转换操作与 Spark 类似,会把一个或多个 Stream 转换成多个 Stream。

在 Flink 中,一个 Stream 可以包含多个分区(Stream Partitions),一个操作符可以被分为多个操作符子任务,每个子任务是在不同的线程或者不同的机器节点中独立运行,如下图所示:

操作符的运算(图片来自极客时间课程)

Stream 和操作符之间的数据传输有两种:

  1. 一对一:Stream 维护着分区及元素的顺序,如上图从输入数据源到 map 间,这意味着 map 操作符的子任务处理的数据和输入数据源的子任务生产的元素的数据相同;
  2. 重新分布(Redistributing):Stream 中数据的分区会发生改变,比如上图的 map 与 keyBy 之间。

Flink 的架构

如下图:

Flink 架构图(图片来自极客时间课程)

整体也是分为四层:存储层、部署层、核心处理引擎、高阶 API/Table API/SQL。

其中:

  1. 核心处理引擎:就是处理分布式的 Streaming DataFlow;
  2. 高阶 API 都会被翻译成包含 Stream 和 Operator 的 DataFlow 执行。

DataSet 和 DataStream API

Flink 的两个核心 API:DataSet 和 DataStream API,其中:DataSet 代表有边界的数据,DataStream 代表无边界的数据。

在 Flink 内部,DataSet 也可以用 Stream 来表示,静态有界数据被看作是特殊的流数据,而且 DataSet 和 DataStream 可以无缝切换,所以,可以认为 Fink 的核心 API 是 DataStream API(未来 Flink 也会将有界数据切换到 DataStream API 上)。

与 Spark 对比

它们相同点:

  1. 都基于内存计算;
  2. 都有统一的批流 API,都支持类 SQL 的 DSL;
  3. 都支持完备的转换操作;
  4. 完善的错误恢复机制;
  5. 都支持 Exactly-Once 语义。

不同点:

角度 Spark Flink
流处理 微批处理,延迟在秒级 毫秒级计算,窗口支持非常完备
SQL Spark 对 SQL 支持更好,相应的优化、扩展和性能更好 Flink 在 SQL 还有较大提升空间
迭代计算 Spark 对机器学习支持较好,但大部分机器学习是有环的数据流,在 Spark 中使用无环图表示 Flink 支持在运行时间的有环数据流,可以更有效地支持机器学习算法
生态 Spark 社区更加活跃 Flink 社区还在快速发展

有兴趣的同学,可以通过下面的链接购买,会有一些优惠

二维码扫描购买有一定优惠

推荐阅读更多精彩内容