实时计算框架特点及对比:Flink、Spark Streaming、Storm

时间:2023-01-18 11:09:44

随着互联网和大数据技术的发展,实时计算框架也在推陈出新,向着高吞吐、高可用、低延迟准实时的方向发展。具体而言,主流的计算引擎不外乎三个:Flink、Spark Streaming、Storm。本文从几个方面总结了各框架的优缺点,希望对读者进行架构设计和技术选型提供帮助。

实时计算框架特点及对比:Flink、Spark Streaming、Storm

各框架对比

1、设计理念

Flink

Flink是事件驱动的实时计算框架,是一个针对流数据和批数据的分布式处理引擎。它认为批是流的特例,数据流分为有限流(Bounded)和无限流(Unbounded),离线计算是对有限数据流的批处理,实时计算是对无限数据流的连续处理。有限流是有明确的开始和结束时间,无限流有明确的开始时间但没有结束时间。Flink是基于事件驱动,内部是对消息逐条emit。

同时,Flink 主要是由 Java 代码实现,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已。

换句话说,Flink 会把所有任务当成流来处理,这也是其最大的特点。Flink 可以支持本地的快速迭代,以及一些环形的迭代任务。并且 Flink 可以定制化内存管理。在这点,如果要对比 Flink 和 Spark 的话,Flink 并没有将内存完全交给应用层。这也是为什么 Spark 相对于 Flink,更容易出现 OOM 的原因(out of memory)。就框架本身与应用场景来说,Flink 更相似于 Storm。

实时计算框架特点及对比:Flink、Spark Streaming、Storm

Spark Streaming

Spark Streaming是在 Spark Core API基础上扩展出来的,以微批模式实现的近实时计算框架,它认为流是批的特例,将输入数据切分成一个个小的切片,利用Spark引擎作为一个个小的batch数据来处理,最终输出切片流,以此实现近似实时计算。

Spark Streaming并不会像Storm那样一次一个地处理数据流,而是在处理前按时间间隔预先将其切分为一段一段的批处理作业。Spark针对持续性数据流的抽象称为DStream(DiscretizedStream),一个DStream是一个微批处理(micro-batching)的RDD(弹性分布式数据集);而RDD则是一种分布式数据集,能够以两种方式并行运作,分别是任意函数和滑动窗口数据的转换

实时计算框架特点及对比:Flink、Spark Streaming、Storm

Storm

Storm也是一个事件驱动的实时流计算框架,完全由开发者自己定义消息被处理的拓扑结构(Topology)。换言之,在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology),它的结构和Mapreduce任务类似,通过自定定义Spout(数据输入处理模块)和Bolt(输出处理模块)逻辑,以及自定义Bolt之间的拓扑依赖关系,完成整个实时事件流的处理逻辑搭建。

期间,Topology这个拓扑将会被提交给集群,由集群中的主控节点(master node)分发代码,将任务分配给工作节点(worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由spout发射出的tuple是不可变数组,对应着固定的键值对。

Trident是在Storm核心API基础上更高层次的抽象,以微批的方式处理实时流,增加了窗口操作、聚合操作等,并且支持Exactly once。

2、基础架构

Flink

实时计算框架特点及对比:Flink、Spark Streaming、Storm实时计算框架特点及对比:Flink、Spark Streaming、Storm

Flink 数据模型是基于流(Streams)和转换(Transformations),由一个或多个 Source作为输入,并终止于一个或多个 Sink,通过不同的转换算子对数据流进行处理。

JobManager:协调分布式任务执行、调度、协调 checkpoints、协调故障恢复等。高可用情况下可以启动多个 JobManager,其中一个选举为 leader,其余为 standby

TaskManager:负责执行具体的task、缓存、交换数据流

Slot:每个 task slot 代表 TaskManager 的一个固定资源,Slot 的个数代表着 TaskManager 可并行执行的 task 数。

对于 Flink 任务客户端首先会生成 StreamGraph,然后生成 JobGraph,将 JobGraph 提交给 JobManager 由它完成 JobGraph 到 ExecutionGraph 的转换,最后由 JobManager 调度执行。

Spark Streaming

Spark Streaming整体架构和Spark一致,角色主要有:

Master:负责集群资源管理和应用程序调度

Worker:负责单个节点的资源管理,driver 和 executor 的启动等

Driver:程序执行入口,初始化SparkContext,负责生成DAG 、划分stage、生成调度task;

Executor:负责执行 task,反馈执行状态和执行结果

对于输入的每个批次都是一个Spark Core任务,Spark Streaming每个批次执行的拓扑结构不固定,会根据数据本地性和资源情况进行调度。

Storm

Nimbus:master节点,负责提交任务,分配到supervisor的worker上

Supervisor:slave节点,负责管理运行在supervisor节点上的worker进程,worker负责运行Topology上的Spout/Bolt任务

实时计算框架特点及对比:Flink、Spark Streaming、Storm

总结

Flink目前已经被各大互联网公司广泛使用,已经成为业界事实标准。Spark Streaming 在高吞吐复杂计算场景仍具优势。Storm 是最早流行的实时计算框架,但由于开发维护较复杂,功能简单,后逐渐被取代,新版本也增加了对事件时间、watermark、窗口计算的支持,成熟度和易用性还不足。