Strom、SparkStreaming以及Flink三种流式框架了解

    本文主要是想了解下Storm、Flink、Spark Streaming这三种流式计算框架的区别以及它们适合的应用场景。

 

Storm:

    Storm 是 Twitter 开源的分布式实时大数据处理框架,擅长处理海量数据,适用于数据实时处理而非批处理。

    Storm也是主从架构,主节点Nimbus负责资源分配和任务调度,工作节点Supervisor负责真正执行任务。一个Supervisor可以有多个工作进程Worker,每个工作进程中可以运行多个Task,每个Task都是一个线程,执行实际的数据处理。Task中运行的是Spout或者Bolt,前者表示的是数据源,后者表示的是消息处理单元,运行用户的程序逻辑。还有一个概念叫Topology,表示应用程序计算逻辑的拓扑结构。

Strom、SparkStreaming以及Flink三种流式框架了解

    Storm中每条消息的数据结构称为Tuple,“A tuple is a named of values where each value can be any type”。 每一个Tuple都是一个值的集合,值是以name, value的形式存在tuple中。

    Apache Storm的主要亮点是,它是一个容错,快速,没有“单点故障”(SPOF)分布式应用程序,但是Storm不支持有状态计算。

 

SparkStreaming:

    SparkStreaming是对于Spark核心API的拓展,从而支持对于实时数据流的可拓展,高吞吐量和容错性流处理。

Strom、SparkStreaming以及Flink三种流式框架了解

    SparkStreaming 提供DStream抽象,底层还是RDD。它接收到的实时流数据,会按照照一定时间间隔将数据拆分成多个数据块,即DStream就是多个RDD组成的一个序列,所以SparkStreaming是以微批来模拟流,并不是一个纯实时的场景

 

SparkStreaming支持有状态计算:

Spark Streaming 通过 updateStateByKey 操作保存任意的状态。为使用这个功能,需要做下面两步:

    1. 定义状态,状态可以是一个任意的数据类型。

    2. 定义状态更新函数,用此函数阐明如何使用之前的状态和来自输入流的新值对状态进行更新。

updateStateByKey 操作要求必须开启Checkpoint机制。且不能是本地文件系统,必须是HDFS。

 

SparkStreaming的反压:

   SparkStreaming 从v1.5开始引入反压机制(back-pressure),由于它是微批处理,所以通过估计当前系统处理数据的速率,动态调节数据接收速率来适配集群数据处理能力(和Flink不同,Flink不需要反压)。

 

Flink:

    Apache Flink是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,早期叫做Stratosphere。2014年,StratoSphere项目中的核心成员从学校出来开发了Flink,同时将Flink计算的主流方向定位为流计算,并在同年将Flink捐赠Apache,后来快速孵化成为Apache的*项目。现在Flink是业界公认的最好的大数据流计算引擎。

   详细内容可见前一篇《Flink运行时环境介绍》。

 

 

框架对比:

项目/引擎

Storm

Spark Streaming

Flink

API

灵活的底层 API 和具有事务保证的 Trident API

流 API 和 Structured-Streaming API 同时也可以使用更适合数据开发的 Spark SQL

流 API 和更加适合数据开发的 Table API 和 Flink SQL 支持

容错机制

ACK 机制

State Checkpoint

State Checkpoint + Savepoint

状态管理

无状态计算

有 UpdateStateByKey 等 API 进行带状态的变更

Key State 和 Operator State两种,State 支持多种持久化方案

处理模式

单条流式处理

Mic batch处理

单条流式处理

延迟

毫秒级

秒级

毫秒级

语义保证

At Least Once,Exactly Once

At Least Once,Exactly Once

At Least Once,Exactly Once

 

 

个人的一些看法:

    1. 如果程序不需要有状态计算并且对延迟要求很高,那么选择Storm。

    2.如果程序需要有状态计算,当前个人的看法是无脑Flink吧。

    ps: 之前和某个大牛交流过,他说他在使用过程中发现Struct Streaming性能比Flink还要快,但是个人觉得Flink比起SparkStreaming延迟要低,而且提供了更多的功能,比如SparkStreaming只有滑动窗口,而Flink提供的就有滑动窗口、滚动窗口、会话窗口等等。

    本人SparkStreaming使用的不多,只在之前写过一些简单的Demo,如果文章中有不对的地方,还请各位指正下。

 

 

 

参考:

    https://blog.csdn.net/u011082453/article/details/82417259(Storm介绍)

    https://blog.csdn.net/mn_kw/article/details/80784245?utm_source=blogkpcl8(Storm与SparkStreaming比对)