大致可以將大數據的計算引擎分成了 4 代。 1、第一代的計算引擎,無疑就是Hadoop承載的MapReduce。它將每個JobApp都被設計為兩個階段,分別為Map和Reduce。對於上層應用來說,就不得不想方設法去拆分演算法,甚至於不得不在 上層應用實現多個App的串聯 ,才能完成一個完整的演算法,例 ...
大致可以將大數據的計算引擎分成了 4 代。
1、第一代的計算引擎,無疑就是Hadoop承載的MapReduce。它將每個JobApp都被設計為兩個階段,分別為Map和Reduce。對於上層應用來說,就不得不想方設法去拆分演算法,甚至於不得不在上層應用實現多個App的串聯,才能完成一個完整的演算法,例如迭代計算,不夠靈活,中間計算結果涉及到磁碟shuffle,影響效率。
Hadoop設計理念來自Google的三篇論文的啟發催生了下列組件
HDFS:分散式存儲【在役】
MapReduce:分散式結算【退役】
Hbase:分散式查詢【在役】
2、由於第一代的弊端,催生了支持 DAG 框架的產生,實現了DAG定義與運算元的解耦。因此,支持用戶在運算元外部自定義 DAG 的框架被劃分為第二代計算引擎。如 Tez 以及更上層的 Oozie。這裡我們不去細究各種 DAG 實現之間的區別,不過對於當時的 Tez 和 Oozie 來說,大多還是批處理的任務。
3、接下來就是以 Spark 為代表的第三代的計算引擎。第三代計算引擎的特點主要是一個App內部支持多個Job,每個Job可以代表一套完整的數據處理流程(用Job完成一個完整流程的隔離),並實現了Job內嵌DAG,以及強調的實時計算。在這裡,很多人也會認為第三代計算引擎也能夠很好的運行批處理的 Job。
Spark中幾個概念的作用範圍:App > Job > Stage > Operator > Task,從左至右都是1對多的關係。
4、隨著第三代計算引擎的出現,促進了上層應用快速發展,例如各種迭代計算的性能以及對流計算和SQL等的支持。Flink的誕生就被歸在了第四代。這應該主要表現在Flink對實時流計算的支持,以及更進一步的實時性上面。當然Flink也可以支持Batch的任務,以及DAG的運算。當然與Spark相比Flink還做了其他優化設計,比如更好的JVM記憶體管理(Flink並沒有將全部記憶體交給App管理,避免了在Spark中較頻發的OOM)。