Spark與Flink比較
Spark是一種快速、通用的計算集群系統,Spark提出的最主要抽象概念是彈性分散式資料集(RDD),它是一個元素集合,劃分到叢集的各個節點上,可以被並行操作。使用者也可以讓Spark保留一個RDD在記憶體中,使其能在並行操作中被有效的重複使用。Flink是可擴充套件的批處理和流式資料處理的資料處理平臺,設計思想主要來源於Hadoop、MPP資料庫、流式計算系統等,支援增量迭代計算。
原理
Spark 1.4特點如下所示。
- Spark為應用提供了REST API來獲取各種資訊,包括jobs、stages、tasks、storage info等。
- Spark Streaming增加了UI,可以方便使用者檢視各種狀態,另外與Kafka的融合也更加深度,加強了對Kinesis的支援。
- Spark SQL(DataFrame)新增ORCFile型別支援,另外還支援所有的Hive metastore。
- Spark ML/MLlib的ML pipelines愈加成熟,提供了更多的演算法和工具。
- Tungsten專案的持續優化,特別是記憶體管理、程式碼生成、垃圾回收等方面都有很多改進。
- SparkR釋出,更友好的R語法支援。
圖1 Spark架構圖
圖2 Flink架構圖
圖3 Spark生態系統圖
Flink 0.9特點如下所示。
- DataSet API 支援Java、Scala和Python。
- DataStream API支援Java and Scala。
- Table API支援類SQL。
- 有機器學習和圖處理(Gelly)的各種庫。
- 有自動優化迭代的功能,如有增量迭代。
- 支援高效序列化和反序列化,非常便利。
- 與Hadoop相容性很好。
圖4 Flink生態系統圖
分析對比
效能對比
首先它們都可以基於記憶體計算框架進行實時計算,所以都擁有非常好的計算效能。經過測試,Flink計算效能上略好。
測試環境:
- CPU:7000個;
- 記憶體:單機128GB;
- 版本:Hadoop 2.3.0,Spark 1.4,Flink 0.9
- 資料:800MB,8GB,8TB;
- 演算法:K-means:以空間中K個點為中心進行聚類,對最靠近它們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。
- 迭代:K=10,3組資料
圖5 迭代次數(縱座標是秒,橫座標是次數)
總結:Spark和Flink全部都執行在Hadoop YARN上,效能為Flink > Spark > Hadoop(MR),迭代次數越多越明顯,效能上,Flink優於Spark和Hadoop最主要的原因是Flink支援增量迭代,具有對迭代自動優化的功能。
流式計算比較
它們都支援流式計算,Flink是一行一行處理,而Spark是基於資料片集合(RDD)進行小批量處理,所以Spark在流式處理方面,不可避免增加一些延時。Flink的流式計算跟Storm效能差不多,支援毫秒級計算,而Spark則只能支援秒級計算。
與Hadoop相容
計算的資源排程都支援YARN的方式
資料存取都支援HDFS、HBase等資料來源。
Flink對Hadoop有著更好的相容,如可以支援原生HBase的TableMapper和TableReducer,唯一不足是現在只支援老版本的MapReduce方法,新版本的MapReduce方法無法得到支援,Spark則不支援TableMapper和TableReducer這些方法。
SQL支援
都支援,Spark對SQL的支援比Flink支援的範圍要大一些,另外Spark支援對SQL的優化,而Flink支援主要是對API級的優化。
計算迭代
delta-iterations,這是Flink特有的,在迭代中可以顯著減少計算,圖6、圖7、圖8是Hadoop(MR)、Spark和Flink的迭代流程。
圖6 Hadoop(MR)迭代流程
圖7 Spark迭代流程
圖8 Flink迭代流程
Flink自動優化迭代程式具體流程如圖9所示。
圖9 Flink自動優化迭代程式具體流程
社群支援
Spark社群活躍度比Flink高很多。
總結
Spark和Flink都支援實時計算,且都可基於記憶體計算。Spark後面最重要的核心元件仍然是Spark SQL,而在未來幾次釋出中,除了效能上更加優化外(包括程式碼生成和快速Join操作),還要提供對SQL語句的擴充套件和更好地整合。至於Flink,其對於流式計算和迭代計算支援力度將會更加增強。無論是Spark、還是Flink的發展重點,將是資料科學和平臺API化,除了傳統的統計演算法外,還包括學習演算法,同時使其生態系統越來越完善。