首先,从 MapReduce 框架存在的问题入手,我们知道了 Spark 的主要优点,比如用内存运算来提高性能;提供很多 High-level API;开发者无需用 map 和 reduce 两个操作实现复杂逻辑;支持流处理等等。。
RDD 是整个 Spark 的核心概念,所有的新 API 在底层都是基于 RDD 实现的。但是 RDD 是否就是完美无缺的呢?显然不是,它还是很底层,不方便开发者使用,而且用 RDD API 写的应用程序需要大量的人工调优来提高性能。
Spark SQL 提供的 DataFrame/DataSet API 就解决了这个问题,它提供类似 SQL 的查询接口,把数据看成关系型数据库的表,提升了熟悉关系型数据库的开发者的工作效率。这部分内容都是专注于数据的批处理,那么我们很自然地就过渡到下一个问题:
Spark 是怎样支持流处理的呢
?那就讲到了 Spark Streaming 和新的 Structured Streaming,这是 Spark 的流处理组件,其中 Structured Streaming 也可以使用 DataSet/DataFrame API,这就实现了 Spark 批流处理的统一。通过这个简单的回顾我们发现,Spark 的发布,和之后各个版本新功能的发布,并不是开发人员拍脑袋的决定,每个新版本发布的功能都是在解决旧功能的问题。在如此多的开源工作者的努力下,Spark 生态系统才有今天的规模,成为了当前最流行的大数据处理框架之一。
所以,这里我想问你一个问题,Spark 有什么缺点?
这个缺点我们之前已经提到过一个——无论是 Spark Streaming 还是 Structured Streaming,Spark 流处理的实时性还不够,所以无法用在一些对实时性要求很高的流处理场景中。这是因为 Spark 的流处理是基于所谓微批处理(Micro-batch processing)的思想,即它把流处理看作是批处理的一种特殊形式,每次接收到一个时间间隔的数据才会去处理,所以天生很难在实时性上有所提升。
虽然在 Spark 2.3 中提出了连续处理模型(Continuous Processing Model),但是现在只支持很有限的功能,并不能在大的项目中使用。Spark 还需要做出很大的努力才能改进现有的流处理模型。想要在流处理的实时性上提升,就不能继续用微批处理的模式,而要想办法实现真正的流处理,即每当有一条数据输入就立刻处理,不做等待。那么当今时代有没有这样的流处理框架呢?Apache Flink 就是其中的翘楚。它采用了基于操作符(Operator)的连续流模型,可以做到微秒级别的延迟。
今天我就带你一起了解一下这个流行的数据处理平台,并将 Flink