2013年參與開發了一個類似storm的自研系統, 2014年使用過spark 4個多月,對這兩個系統都有一些了解。
下面是我關於這兩個系統的簡單對比:
Spark:
1. 基於數據並行,https://en.wikipedia.org/wiki/Data_parallelism。相同的操作作用在數據的不同部分,利用transformation的pipeline提高性能。
2. 本質上是batch processing,latency 通常> 1s。
3. RDD是spark的核心,封裝了分布式的細節,即partition和根據lineage恢復數據。shuffle牽涉到數據在網絡間的移動,為了容錯,中間結果要落地磁盤,因此在一些應用中會是瓶頸。
4. RDD是immutable和coarse granularity,簡化了設計。
5. 比較像優化(擴展)了MapReduce的計算框架,並將數據放進了內存,加速迭代計算,非常適合於迭代式應用,比如機器學習,adhoc查詢,圖計算等。
Storm:
1. 基於任務並行。https://en.wikipedia.org/wiki/Task_parallelism。請求(或者說event)流進系統依次被topology上的task執行。不同task是並行(concurrent)執行。
2. 本質是realtime processing, latency 通常 < 1s。(Storm Trident支持批處理)。
3. 資源管理(在哪些機器上起task)和task間通信是storm的核心。
4. 比較像傳統的實時后台系統多個模塊(application)拼接成一個大的應用。
所以,可以看到spark和storm有不同的應用場景。能和storm比較的是spark streaming. spark streaming是一個spark的流式處理器,
基本的原理是:將一個時間窗口的數據收集起來,轉換成RDD,再根據業務邏輯生成新的RDD,最后遍歷結果RDD,把數據發出去。
spark streaming是一個分布式系統,也有分布式系統的復雜性。比如,receiver failure的時候,可能會丟數據。
參考資料:
1. spark paper。http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf
2. committer的報告。Yahoo compares Storm and Spark。http://www.slideshare.net/ChicagoHUG/yahoo-compares-storm-and- spark?ref=http://yahoohadoop.tumblr.com/post/98213421641/storm-and-spark-at-yahoo-why-chose-one-over-the
3. committer的報告。storm和spark streaming的對比。http://www.slideshare.net/ptgoetz/apache-storm-vs-spark-streaming