Apache 兩個開源項目比較:Flink vs Spark

自動駕駛的平臺需要雲計算,比如大量的機器學習和深度學習訓練,高清地圖,模擬仿真模塊,還有車聯網。

這裏看到一篇Spark和Flink的比較文章,藉機轉載,以後要重新學習這個領域的新東西。

Introduction to Apache Flink for Spark Developers : Flink vs Spark​blog.madhukaraphatak.com

Apache Flink是新一代通用大數據處理引擎,旨在統一不同的數據負載。 聽起來像Apache Spark嗎? 是的。 Flink正試圖解決Spark試圖解決的同樣問題。 這兩個系統都旨在構建單一平臺,可以在其中運行批處理,流媒體,交互式,圖形處理,機器學習等。因此,Flink與Spark的意識形態中介沒有太大差別。 但它們在實施細節方面確實存在很大差異。

下面比較Spark和Flink的不同。 一些方法在兩個框架中都是相同的,而有些方法有很大不同。

圖片源自黃浴的知乎

1.抽象

在Spark中,對於批處理,有RDD抽象和DStream用於流式傳輸,這是內部RDD本身。因此,在Spark下面代表的所有數據都使用RDD抽象來表示。

在Flink中,爲批處理數據集提供了數據集抽象,爲流應用程序提供了DataStream。它們聽起來與RDD和DStreams非常相似,但它們不是。

差異是以下幾點:

數據集在運行時只是計劃

在Spark中,RDD在運行時表示爲java對象。隨着project Tungsten的推出,它有點變化。但在Apache Flink中,數據集被表示爲一個邏輯計劃。這聽起來很熟悉嗎?是的,它們就像Spark中的Dataframe。所以在Flink中可以像使用優化器優化的一等公民那樣獲得像api這樣的Dataframe。但是在Spark RDD之間不做任何優化。

Flink的數據集就像Spark的Dataframe API,在執行之前進行了優化。

在Spark 1.6中,數據集API被添加到spark中,這可能最終取代RDD抽象。

Dataset和DataStream是獨立的API

在Spark中,所有不同的抽象,如DStream,Dataframe都建立在RDD抽象之上。但在Flink中,Dataset和DataStream是基於頂級通用引擎構建的兩個獨立抽象。雖然它們模仿了類似的API,但是在DStream和RDD的情況下,無法將它們組合在一起。儘管在這方面有一些努力,但最終結果還不夠明確。

不能將DataSet和DataStream組合在一起,如RDD和DStreams。

因此,雖然Flink和Spark都有類似的抽象,但它們的實現方式不同。

2. 內存管理

直到Spark 1.5,Spark使用Java堆來緩存數據。雖然項目開始時更容易,但它導致了內存不足(OOM)問題和垃圾收集(gc)暫停。因此,從1.5開始,Spark進入定製內存管理,稱爲project tungsten。

Flink從第一天起就開始定製內存管理。實際上,這是Spark向這個方向發展的靈感之一。不僅Flink將數據存儲在它的自定義二進制佈局中,它確實直接對二進制數據進行操作。在Spark中,所有數據幀操作都直接在Spark 1.5的project tungsten二進制數據上運行。

在JVM上執行自定義內存管理可以提高性能並提高資源利用率。

3. 實施語言

Spark在Scala中實現。它提供其他語言的API,如Java,Python和R。

Flink是用Java實現的。它確實提供了Scala API。

因此,與Flink相比,Spark中的選擇語言更好。在Flink的一些scala API中,java抽象也是API的。這會有所改進,因爲已經使scala API獲得了更多用戶。

4. API

Spark和Flink都模仿scala集合API。所以從表面來看,兩者的API看起來非常相似。

5. 流

Apache Spark將流式處理視爲快速批處理。 Apache Flink將批處理視爲流處理的特殊情況。這兩種方法都具有令人着迷的含義。

兩種不同方法的差異或含義:

實時與近實時

Apache Flink提供事件級處理,也稱爲實時流。它與Storm模型非常相似。

Spark只有不提供事件級粒度的最小批處理(mini-batch)。這種方法被稱爲近實時。

Spark流式處理是更快的批處理,Flink批處理是有限的流處理。

雖然大多數應用程序都可以近乎實時地使用,但很少有應用程序需要事件級實時處理。這些應用程序通常是Storm流而不是Spark流。對於他們來說,Flink將成爲非常有趣的選擇。

能夠將歷史數據/流相結合

運行流處理作爲更快批處理的優點之一是,我們可以在兩種情況下使用相同的抽象。 Spark非常支持組合批處理和流數據,因爲它們都使用RDD抽象。

在Flink的情況下,批處理和流式傳輸不共享相同的API抽象。因此,儘管有一些方法可以將基於歷史文件的數據與流相結合,但它並不像Spark那樣乾淨。

在許多應用中,這種能力非常重要。在這些應用程序中,Spark代替Flink流式傳輸。

靈活的窗口

由於最小批處理的性質,Spark現在對窗口的支持非常有限。允許根據處理時間窗口批量處理。
與其他任何系統相比,Flink提供了非常靈活的窗口系統。 Window是Flink流API的主要焦點之一。它允許基於處理時間、數據時間和無記錄等的窗口。這種靈活性使Flink流API與Spark相比非常強大。

6. SQL界面

截至目前,最活躍的Spark庫之一是spark-sql。 Spark提供了像Hive一樣的查詢語言和像DSL這樣的Dataframe來查詢結構化數據。它是成熟的API並且在批處理中廣泛使用並且很快將在流媒體世界中使用。

截至目前,Flink Table API僅支持DSL等數據幀,並且仍處於測試階段。有計劃添加sql接口,但不確定何時會落在框架中。

目前爲止,Spark與Flink相比有着不錯的SQL故事。

7. 數據源集成

Spark數據源API是框架中最好的API之一。數據源API使得所有智能資源如NoSQL數據庫,鑲木地板,優化行列(Optimized Row Columnar,ORC)成爲Spark上的頭等公民。此API還提供了在源級執行謂詞下推(predicate push down)等高級操作的功能。

Flink仍然在很大程度上依賴於map / reduce InputFormat來進行數據源集成。雖然它是足夠好的提取數據API,但它不能巧妙地利用源能力。因此Flink目前落後於目前的數據源集成技術。

8. 迭代處理

Spark最受關注的功能之一就是能夠有效地進行機器學習。在內存緩存和其他實現細節中,它是實現機器學習算法的真正強大的平臺。

雖然ML算法是循環數據流,但它表示爲Spark內部的直接非循環圖。通常,沒有分佈式處理系統鼓勵循環數據流,因爲它們變得難以理解。

但是Flink對其他人採取了一些不同的方法。它們在運行時支持受控循環依賴圖(cyclic dependence graph)。這使得它們與DAG表示相比以非常有效的方式表示ML算法。因此,Flink支持本機平臺中的迭代,與DAG方法相比,可實現卓越的可擴展性和性能。

9. 流作爲平臺與批處理作爲平臺

Apache Spark來自Map / Reduce時代,它將整個計算表示爲數據作爲文件集合的移動。這些文件可能作爲磁盤上的陣列或物理文件駐留在內存中。這具有非常好的屬性,如容錯等。
但是Flink是一種新型系統,它將整個計算表示爲流處理,其中數據有爭議地移動而沒有任何障礙。這個想法與像akka-streams這樣的新的反應流系統非常相似。

10. 成熟

Flink像批處理這樣的部分已經投入生產,但其他部分如流媒體,Table API仍在不斷髮展。這並不是說在生產中就沒人使用Flink流。

圖片源自黃浴的知乎

總結

與Flink相比,Spark是一個非常成熟和完整的框架,但Flink確實帶來了非常有趣的想法,如自定義內存管理,數據集API等。 Spark社區正在認識它並將這些想法融入到Spark中。 所以從這個意義上來說,Flink正在將大數據處理完全提升到下一個層次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章