Flink為什么比Spark快?大數(shù)據(jù)流處理的框架比較
大數(shù)據(jù)處理的新趨勢,流處理和批處理是非常重要的兩個概念,而基于流處理和批處理的大數(shù)據(jù)處理框架,F(xiàn)link和Spark,也是常常被大家拿來做比較的對象。而在實(shí)時流數(shù)據(jù)處理上,F(xiàn)link性能似乎更加強(qiáng)勁,那么Flink為什么比Spark快呢,今天我們就來聊聊這個話題。
Spark和Flink都是針對于實(shí)時數(shù)據(jù)處理的框架,并且兩者也都在實(shí)際的工作當(dāng)中表現(xiàn)出色,但是如果要深究兩者在大數(shù)據(jù)處理的區(qū)別,我們需要從Spark和Flink的引擎技術(shù)開始講起。
Spark和Flink計算引擎,在處理大規(guī)模數(shù)據(jù)上,數(shù)據(jù)模型和處理模型有很大的差別。
Spark的數(shù)據(jù)模型是彈性分布式數(shù)據(jù)集RDD(Resilient Distributed Datasets)。RDD可以實(shí)現(xiàn)為分布式共享內(nèi)存或者完全虛擬化(即有的中間結(jié)果RDD當(dāng)下游處理完全在本地時可以直接優(yōu)化省略掉)。這樣可以省掉很多不必要的I/O,是早期Spark性能優(yōu)勢的主要原因。
Spark用RDD上的變換(算子)來描述數(shù)據(jù)處理。每個算子(如map,filter,join)生成一個新的RDD。所有的算子組成一個有向無環(huán)圖(DAG)。這就是Spark進(jìn)行數(shù)據(jù)處理的核心機(jī)制。
而Flink的基本數(shù)據(jù)模型,則是數(shù)據(jù)流,及事件(Event)的序列。數(shù)據(jù)流作為數(shù)據(jù)的基本模型,這個流可以是無邊界的無限流,即一般意義上的流處理。也可以是有邊界的有限流,這樣就是批處理。
Flink用數(shù)據(jù)流上的變換(算子)來描述數(shù)據(jù)處理。每個算子生成一個新的數(shù)據(jù)流。在算子,DAG,和上下游算子鏈接(chaining)這些方面,和Spark的基本思路是一樣的。
但是在在DAG的執(zhí)行上,Spark和Flink有明顯的不同。
在Flink的流執(zhí)行模式中,一個事件在一個節(jié)點(diǎn)處理完后的輸出就可以發(fā)到下一個節(jié)點(diǎn)立即處理。這樣執(zhí)行引擎并不會引入額外的延遲。而Spark的micro batch和一般的batch執(zhí)行一樣,處理完上游的stage得到輸出之后才開始下游的stage。
這也就是Flink為什么比Spark快的原因之一。并且Flink在數(shù)據(jù)流計算執(zhí)行時,還可以把多個事件一起進(jìn)行傳輸和計算,進(jìn)一步實(shí)現(xiàn)數(shù)據(jù)計算的低延遲。所以Flink之所以快,其實(shí)也可以理解為比Spark的延遲性更低。