赞
踩
无论是 Spark Streaming还是 Structured Streaming,
Spark流处理的实时性还不够,所以无法用在一些对实时性要求很高的流处理场景中。
这是因为 Spark的流处理是基于所谓微批处理( Micro- batch processing)的思想,即它把流
处理看作是批处理的一种特殊形式,每次接收到一个时间间隔的数据才会去处理,所以天生很难在实时性上有所提升。
虽然在 Spark2.3中提出了连续处理模型( Continuous Processing Model),但是现在只支持
很有限的功能,并不能在大的项目中使用。 Spark还需要做出很大的努力才能改进现有的流处理模型想要在流处理的实时性上提升,就不能継续用微批处理的模式,而要想办法实现真正的流处理即每当有一条数据输入就立刻处理,不做等待。
采用了基于操作符(Operator)的连续流模型,可以做到微秒级别的延迟。
Flink最核心的数据结构是Stream,它代表一个运行在多分区上的并行流。
在 Stream 上同样可以进行各种转换操作(Transformation)。与 Spark 的 RDD 不同的是,Stream 代表一个数据流而不是静态数据的集合。所以,它包含的数据是随着时间增长而变化的。而且 Stream 上的转换操作都是逐条进行的,即每当有新的数据进来,整个流程都会被执行并更新结果。这样的基本处理模式决定了 Flink 会比 Spark Streaming 有更低的流处理延迟性。
当一个 Flink 程序被执行的时候,它会被映射为 Streaming Dataflow,下图就是一个Streaming Dataflow 的示意图。
在图中,你可以看出Streaming Dataflow 包括Stream和Operator(操作符)。转换操作符把一个或多个Stream 转换成多个Stream。每个Dataflow都有一个输入数据源(Source)和输出数据源(Sink)。与Spark的RDD转换图类似,Streaming Dataflow也会被组合成一个有向无环图去执行。
在Flink中,程序天生是并行和分布式的。一个Stream可以包含多个分区(Stream Partitions),一个操作符可以被分成多个操作符子任务,每一个子任务是在不同的线程或者不同的机器节点中独立执行的。如下图所示:
从上图你可以看出,Stream在操作符之间传输数据的形式有两种:一对一和重新分布。
当前版本Flink的架构如下图所示
这个架构和Spark 架构比较类似,都分为四层:存储层、部署层、核心处理引擎、high-level的API和库。
Flink 提供的两个核心API就是DataSet APl和DataStream APl。你没看错,名字和Spark的DataSet、DataFrame 非常相似。顾名思义,DataSet代表有界的数据集,而DataStream代表流数据。所以,DataSet API是用来做批处理的,而DataStream API是做流处理的。
也许你会问,Flink 这样基于流的模型是怎样支持批处理的?在内部,DataSet 其实也用Stream表示,静态的有界数据也可以被看作是特殊的流数据,而且DataSet与DataStream 可以无缝切换。所以,Flink的核心是DataStream。
通过前面的学习,我们了解到,Spark和Flink都支持批处理和流处理,接下来让我们对这两种流行的数据处理框架在各方面进行对比。首先,这两个数据处理框架有很多相同点。
当然,它们的不同点也是相当明显,我们可以从4个不同的角度来看。
对于以下场景,你可以选择 Spark。
Spark完美满足这些场景的需求,而且它可以一站式解决这些问题,无需用别的数据处理平台。由于Flink是为了提升流处理而创建的平台,所以它适用于各种需要非常低延迟(微秒到毫秒级)的实时数据处理场景,比如实时日志报表分析。
而且Flink 用流处理去模拟批处理的思想,比Spark 用批处理去模拟流处理的思想扩展性更好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。