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