Storm,Spark,Flink对比
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Storm,Spark,Flink对比相关的知识,希望对你有一定的参考价值。
参考技术A一、容错性(Fault Tolerance)
spark依赖checkpoint机制来进行容错,只要batch执行到doCheckpoint操作前挂了,那么该batch就会被完整的重新计算。spark可以保证计算过程的exactly once(不包含sink的exactly once)。
storm的容错通过ack机制实现,每个bolt或spout处理完成一条data后会发送一条ack消息给acker bolt。当该条data被所有节点都处理过后,它会收到来自所有节点ack, 这样一条data处理就是成功的。storm可以保证数据不丢失,但是只能达到at least once语义。此外,因为需要每条data都做ack,所以容错的开销很大。storm trident是基于micro¬batched实现了exactly once语义。
flink使用Chandy-Chandy-Lamport Algorithm 来做Asynchronous Distributed Snapshots(异步分布式快照),其本质也是checkpoint。如下图,flink定时往流里插入一个barrier(隔栏),这些barriers把数据分割成若干个小的部分,当barrier流到某个operator时,operator立即会对barrier对应的一小部分数据做checkpoint并且把barrier传给下游(checkpoint操作是异步的,并不会打断数据的处理),直到所有的sink operator做完自己checkpoint后,一个完整的checkpoint才算完成。当出现failure时,flink会从最新完整的checkpoint点开始恢复。
flink的checkpoint机制非常轻量,barrier不会打断streaming的流动,而且做checkpoint操作也是异步的。其次,相比storm需要ack每条data,flink做的是small batch的checkpoint,容错的代价相对要低很多。最重要的是flink的checkpoint机制能保证exactly once。
二、吞吐量和延迟(Throughputs& Latency)
01 吞吐量(throughputs)
spark是mirco-batch级别的计算,各种优化做的也很好,它的throughputs是最大的。但是需要提一下,有状态计算(如updateStateByKey算子)需要通过额外的rdd来维护状态,导致开销较大,对吞吐量影响也较大。
storm的容错机制需要对每条data进行ack,因此容错开销对throughputs影响巨大,throughputs下降甚至可以达到70%。storm trident是基于micro-batch实现的,throughput中等。
flink的容错机制较为轻量,对throughputs影响较小,而且拥有图和调度上的一些优化机制,使得flink可以达到很高 throughputs。
下图是flink官网给出的storm和flink的benchmark,我们可以看出storm在打开ack容错机制后,throughputs下降非常明显。而flink在开启checkpoint和关闭的情况下throughputs变化不大,说明flink的容错机制确实代价不高。对比官网的benchmark,我们也进行了throughputs的测试,实测结果是flink throughputs是storm的3.5倍,而且在解除了kafka集群和flink集群的带宽瓶颈后,flink自身又提高了1.6倍。
02 延迟(latency)
spark基于micro-batch实现,提高了throughputs,但是付出了latency的代价。一般spark的latency是秒级别的。
storm是native streaming实现,可以轻松的达到几十毫秒级别的latency,在几款框架中它的latency是最低的。storm trident是基于micro-batch实现的,latency较高。
flink也是native streaming实现,也可以达到百毫秒级别的latency。
下图是flink官网给出的和storm的latency对比benchmark。storm可以达到平均5毫秒以内的latency,而flink的平均latency也在30毫秒以内。两者的99%的data都在55毫秒latency内处理完成,表现都很优秀。
三、 总 结
综合对比spark、storm和flink的功能、容错和性能(总结如下图)
Flink与storm的主要区别译文。
Qestion:
Flink被用来和Spark相比,但是我认为这样的比较不太合适,把Flink窗口事件和Spark微批处理进行比较,同样的Flink与Samza对比也是,这两种情况下的比较都是实时流计算与批量处理事件策略的比较,我更想比较Flink与Storm之间的区别,这两者在概念上更相近。
我发现了这个幻灯片1(4),他主要的区别在于“可调整延迟时间”,在Slicon Angle的文章中一些暗示,flink更好的集成了spark与HadoopMr,但是没有实际确切的细节与提及。在最近的一场分享上 Fabian Hueske说“和Storm相比,flink提供了更高级的api,和一种更加轻量级的容错策略来提供exactly-once语义得到确切执行”。
上面提到的,我对这方面了解比较少?我不是能十分理解这些观点,可以解释一下这些问题吗?流在storm中是怎么处理的?在flink中又是怎么解决的? Hueske 所说的更高级的api是什么?更轻量级的容错策略又是什么?
answer1:
声明:我是Apache Flink 项目代码的提交者和PMC 成员,我只对Storm高层架构熟悉,对其底层实现不熟悉。
Apache Flink是一个统一流处理与批处理的框架。由于流水线数据在并行任务之间进行传输(包括数据的洗牌shuffles),flink在运行时支持流处理与批处理。数据被立刻的传输从生产数据的任务到接受数据的任务(在网络传输中被收集在一个缓存中,然后发送)之后,批处理的任务可以被选择来处理这些阻塞的数据。
Apache Spark 也是一个处理流和批处理的框架,Flink 的批处理api用法案列和Spark 非常相似,但是内部实现不一样。对于处理流来说,两种框架采用了不同的实现使得他们适合于不同场景的应用(Spark 微批处理 vs Flink 流计算),我可以说Spark与Flink的比较是有用有效的。然而Spark却和Flink 不是最相似的流处理引擎。
回到原来的问题。Apache Storm 只能处理流数据,没有批处理的能力。事实上,Flink的流式处理引擎和Storm很相似,比如 Flink的并行任务和Storm的bolt很相似。他俩都是通过流水线数据的传输来降低数据延时。然而Flink 提供了很多跟高级的api ,Flink的DataStream提供了Map、GroupBy、Window和Join等api来代替storm的bolt在一个或多个readers 和collectors的功能,而Storm在实现这些功能的时候都需要程序员自己实现。另外的不同在于处理语义。Storm提供了"at-least-once "而Flink提供了"exactly-once",两个框架给与语义不同的保证在实现上也就相当的不同。Storm 采用 record-level ack,Flink采用Chandy-Lamport的轻微变种。简言之,在数据源中周期性的注入marker,然后放入数据流中,无论何时只要任务执行器接受到一个marker,执行器检查他的内部状态。当一个marker被所有的数据输出sink给接收到,证明这个marker被提交(在这个marker之前的所有执行的数据,到上一个被提交的marker之后的所以数据)。万一有一个sink没有接受到marker,所有的源操作器将从置他们的处理数据到最近一次确认提交的marker然后继续执行。这种检查标记点的方法比record-level ack更加的轻量级。这个幻灯片(幻灯片2)讨论了flink相应的容错机制、检查点、处理状态。
Storm也提供了 exactly-once 以及高级api ,但是被称为Trident ,然而Trident 是在微批处理的基础上实现的,就很像Spark了而不是Flink
Flink的“可调延迟性”指的是Flink的记录从一个任务到另外一个任务的时间延迟。我再前面说了,flink使用流水线转移,在数据生成之后快速转发。为了效率,这些记录会被收集起来放在缓冲器中,当缓冲器满了或者是到了一个确定的阈值时间点被网络发送。这个阈值控制着这个记录的延迟。因为他指定了最大时间的延迟,一个记录从生成到发送出去。然而,他不能被用来保证一个数据从进入Flink项目到出Flink项目所花费的时间,因为这取决于任务处理执行时间和网络传输了多少次。
Answer2:
添加到上一条回答;
Flink比Storm的改进还有以下几点:
背压:Flink流计算当不同操作器在速度不同的时候表现的很好。因为低速流操作器背压高速流操作器很好,虽然网络层管理控制缓存池。
用户定义状态:Flink允许用户在操作器中自定义状态。这个自定义状态可以参与在检查点的容错处理,也提供exactly-once语义支持。参见这个列子(幻灯片3),在一个操作器中用户自定义机器状态,该状态始终与数据流一起参与checkpoint。
流窗口:流窗口和窗口聚合是数据流分析的重要组成部分。Flink配备了一个非常强大的窗口系统,支持多种类型的窗口。
译文:
https://stackoverflow.com/questions/30699119/what-is-are-the-main-differences-between-flink-and-storm
幻灯片1:
https://www.slideshare.net/GyulaFra/flink-streaming-43445818
幻灯片2:
https://www.slideshare.net/stephanewen1/flink-history-roadmap-and-vision
https://www.youtube.com/watch?v=fw2DBE6ZiEQ
幻灯片3:
https://github.com/StephanEwen/flink-demos/tree/master/streaming-state-machine
stackoverflow:the difference between spark and flink
https://stackoverflow.com/questions/28082581/what-is-the-difference-between-apache-spark-and-apache-flink
以上是关于Storm,Spark,Flink对比的主要内容,如果未能解决你的问题,请参考以下文章
实时计算框架Flink,Spark Streaming,Storm对比
Apache 流框架 Flink,Spark Streaming,Storm对比分析 - Part1