### 前言
現今Spark正是風頭正勁時,Spark本是UCBerkeley的AMPLab誕生的項目,后來捐贈給了Apache來管理源碼和后續發展。今年從Apache孵化器終于孵化出了1.0版本。其對大數據的支持從內存計算和流處理,到交互式查詢,一直到圖計算和機器學習,可謂擺開了架勢、拉長了戰線,一方面挑戰老前輩Hadoop和MapReduce,另一方面又隨時準備迎接同樣的后起之秀的挑戰。
### 大數據的今天
今天的大數據系統生物圈百花齊放,有已經如日中天的通用批處理MapReduce,也有針對不同應用場景而特殊化的處理系統。

### 全棧式的Spark
Spark作為后起之秀,以其RDD模型的強大表現能力,不斷完善自己的功能,逐漸形成了一套自己的生物圈,提供了full-stack的解決方案。其中主要包括Spark內存中批處理,Shark交互式查詢,Spark Streaming流式計算三大部分。此外還有GraphX和MLBase提供的常用圖計算和機器學習算法。

而Spark由于采用Scala編寫,底層使用Akka,代碼十分簡潔。而且借助RDD的強大表現力,Spark各種子項目的代碼量也很小。

### Spark使用情況
援引自[一篇博文](http://www.beagledata.com/news/764.html),看一下Spark在互聯網界的使用情況。
**1.?騰訊**
**“**廣點通是最早使用Spark的應用之一。騰訊大數據精準推薦借助Spark快速迭代的優勢,圍繞“數據+算法+系統”這套技術方案,實現了在“數據實時采集、算法實時訓練、系統實時預測”的全流程實時并行高維算法,最終成功應用于廣點通pCTR投放系統上,支持每天上百億的請求量。
基于日志數據的快速查詢系統業務構建于Spark之上的Shark,利用其快速查詢以及內存表等優勢,承擔了日志數據的即席查詢工作。在性能方面,普遍比Hive高2-10倍,如果使用內存表的功能,性能將會比Hive快百倍。
**2. Yahoo**
**“**Yahoo將Spark用在Audience Expansion中的應用。Audience Expansion是廣告中尋找目標用戶的一種方法:首先廣告者提供一些觀看了廣告并且購買產品的樣本客戶,據此進行學習,尋找更多可能轉化的用戶,對他們定向廣告。Yahoo采用的算法是logistic regression。同時由于有些SQL負載需要更高的服務質量,又加入了專門跑Shark的大內存集群,用于取代商業BI/OLAP工具,承擔報表/儀表盤和交互式/即席查詢,同時與桌面BI工具對接。目前在Yahoo部署的Spark集群有112臺節點,9.2TB內存。
**3.?淘寶**
**“**阿里搜索和廣告業務,最初使用Mahout或者自己寫的MR來解決復雜的機器學習,導致效率低而且代碼不易維護。淘寶技術團隊使用了Spark來解決多次迭代的機器學習算法、高計算復雜度的算法等。將Spark運用于淘寶的推薦相關算法上,同時還利用Graphx解決了許多生產問題,包括以下計算場景:基于度分布的中樞節點發現、基于最大連通圖的社區發現、基于三角形計數的關系衡量、基于隨機游走的用戶屬性傳播等。
**4.?優酷土豆**
**“**優酷土豆在使用Hadoop集群的突出問題主要包括:第一是商業智能BI方面,分析師提交任務之后需要等待很久才得到結果;第二就是大數據量計算,比如進行一些模擬廣告投放之時,計算量非常大的同時對效率要求也比較高,最后就是機器學習和圖計算的迭代運算也是需要耗費大量資源且速度很慢。
最終發現這些應用場景并不適合在MapReduce里面去處理。通過對比,發現Spark性能比MapReduce提升很多。首先,交互查詢響應快,性能比Hadoop提高若干倍;模擬廣告投放計算效率高、延遲小(同hadoop比延遲至少降低一個數量級);機器學習、圖計算等迭代計算,大大減少了網絡傳輸、數據落地等,極大的提高的計算性能。目前Spark已經廣泛使用在優酷土豆的視頻推薦(圖計算)、廣告業務等。
### Spark的戰線
???**DAG執行引擎**:不少框架都提出了類似的基于DAG圖的執行引擎,來對MapReduce模型的缺點進行優化。如Apache下的Ooize和Tez。
???**內存計算**:作為Spark的殺手锏,分布式內存計算的市場競爭也非常激烈,有非常火的SAP的HANA平臺,微軟的Dryad,以及Druid。此外,還有眾多的數據庫廠商推出了內存數據庫、內存表或內存計算網格(data grid)等產品。
??**交互式查詢(Shark)**:Hive的性能問題和(近)實時分析的需求使得不少公司都提出了自己的解決方案。其中最耀眼的當屬無敵的Google提出的Dremel嵌套計算模型。而其開源版本也是眾多,有Cloudera Impala配合Parquet,以及Apache的Drill。
???**流式計算(Streaming Spark)**:Spark通過將連續的數據流劃分成離散的數據段,從而將觸角伸到了流式處理領域。而在這一領域,Twitter的Storm(已捐給Apache)被許多公司采用,也是不可小覷。相比之下,Yahoo的S4就顯得冷清多了。
??**圖計算(GraphX)**:圖計算方面,Spark借鑒了Pregel和PowerGraph中的圖分布式計算和圖切割思想,提出了自己的工具包GraphX。它擴展了Spark,例如用EdgeRDD了和VertextRDD表示邊和頂點等。
???**機器學習(MLBase)**:機器學習方面,Mahout是個有力的競爭對手,但Mahout也是基于MapReduce任務實現的。而在線機器學習框架Jubatus資料很少,進展不明。
看完這些總結后,不得不佩服Spark的應用范圍之廣!感覺目前Spark唯一沒有單獨建立子項目的就是存儲方面了,主要是中間內存計算時的存儲引擎。目前要么完全由Spark在內存中管理,要么通過Tachyon統一管理。
### Spark的未來
**Spark 1.0.1**
???Spark SQL(原Shark)支持JSON
**Spark 1.1**
???通用Shuffle接口
???MLLib統計算法
???JDBC驅動
???基于排序的Shuffle
**Spark 1.2**
???重構存儲支持
**Spark 1.3+**
???**SparkR對R語言統計分析的支持**(目前已能下載)

### 參考資料
1 The State of Spark
2[大數據計算新貴Spark在騰訊雅虎優酷成功應用解析](http://www.beagledata.com/news/764.html)
3 The Future of Apache Spark