自動駕駛的平臺需要雲計算,比如大量的機器學習和深度學習訓練,高清地圖,模擬仿真模塊,還有車聯網。
這裏看到一篇Spark和Flink的比較文章,藉機轉載,以後要重新學習這個領域的新東西。
Introduction to Apache Flink for Spark Developers : Flink vs Sparkblog.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正在將大數據處理完全提升到下一個層次。