大資料處理之——簡明Spark介紹
很多涉及或者並行式機器學習工作或者大資料處理的崗位,基本都會有要求會使用Hadoop/Hive/Spark/Storm這幾個開源工具,那麼針對其中比較主流的Spark,我在這裡做一個比較簡單地總結。
什麼是Spark?
在技術不斷告訴更迭的程式圈,一個新的工具的出現與流行必然是因為它滿足了很大一部分人長期未被滿足的需求,或是解決了一個長期讓很多人難受的一個痛點。
以上這個定理提醒我們,要學一個新技術,就有必要先了解這門技術出現的意義。這樣,我們才能更好明白:它是應用到什麼場景的,相比同類工具它的優缺點是什麼,因此什麼時候用它比其它工具好或差等等等等。只有至少理解了這些,才好說自己是真正掌握了這個工具,否則只能說是淺嘗輒止,半生不熟。
Spark,最早是2009年Berkeley大學AMPLab實驗室開發的一個分散式、記憶體式、流式計算引擎,初衷為了可以高速地進行大量的資料的一系列處理工作。後來專案給了Apache基金會運營。14年的Databricks團隊使用Spark重新整理資料排序世界記錄,可算是讓Spark一戰成名。 (參考 wiki-Spark)
為什麼要用Spark?
說到底,Spark的就是一個非常非常“快”的大資料計算引擎,可以高速地完成大量資料的複雜處理任務。
而我們用Spark,也是因為它的快!它非常快,以至於我們可以在很短的時間內完成原來需要很長時間完成的相同量級的任務。那它具體快到什麼程度?Spark為什麼可以這麼快呢?我們來看看它的wiki說明:
相對於Hadoop的MapReduce會在執行完工作後將中介資料存放到磁碟中,Spark使用了記憶體內運算技術,能在資料尚未寫入硬碟時即在記憶體內分析運算。Spark在記憶體內執行程式的運算速度能做到比Hadoop MapReduce的運算速度快上100倍,即便是執行程式於硬碟時,Spark也能快上10倍速度。Spark允許使用者將資料載入至叢集記憶體,並多次對其進行查詢,非常適合用於機器學習演算法。
“100倍”!“10倍”!和同類的工具比較起來,已經不是一個數量級的速度了(當然下任何結論都是要給條件和約束的,這裡只是一個比較簡單粗暴的說明,目的是給大家一個比較直觀的感受。就好像spark的快,是應該在一定環境下說的,比如跑什麼型別的任務,機器的效能如何等等。)。而簡單說來,在滿足效能需求的情況下,Spark確實在很多同類任務上都能實現遠超Hadoop的效率!
這裡出現了與它的一個同類大胸弟——Hadoop的對比,同樣是大資料處理的常用工具(具體有關Hadoop的簡明教程我會另開一篇文章來寫),說明中告訴我們,Spark是一直在記憶體裡面算,Hadoop是執行過程中會將中間的資料不斷寫入再讀出磁碟,而我們也知道,系統I/O操作是一個比較耗時的操作,Hadoop由於其實現機制問題,不得不地進行大量I/O操作,而Spark一直在記憶體中幹活,就省去了這些麻煩,只在資料完全處理完畢後一次性輸出。
另外,從兩者任務的執行機制來看,Spark是將任務做成了DAG有向無環圖的模式,而Hadoop是用MapReduce(MR)模式,而DAG模式本身是比MR模式在處理效率上更高,因為DAG可以有效減少Map和Reduce任務之間傳遞資料的過程。(這裡只是大概的一個表述,言語不恰當處請見諒)
其它的具體對比可以參照知乎上的回答。
另外,Spark本身在需要大量迭代的運算上非常有優勢,而機器學習演算法恰恰是會涉及到許多迭代操作的,因此Spark跑機器學習演算法是非常完美的配合。
Spark的相關工具與開發語言
生態圈
Spark畢竟是一個單兵,而它自己還需要得手的武器,以及和其它的夥伴的配合,才能完整地發揮它的作用。
而它自己的軍火庫裡有:
- Spark Streaming:流處理庫
- graph-parallel:圖並行處理庫
- ML:機器學習庫
- Shark SQL:並行式SQL查詢庫
而它的好夥伴有:
- HDFS、Tachyon:分散式檔案儲存系統(大量資料的儲存)
- Mesos,YARN:資源管理框架(排程計算任務)
這些豐富的庫和其它工具使得Spark可以勝任多種型別的計算任務,在各種實際需求下都能遊刃有餘地發揮其最大的效用。
開發語言
Spark程式本身支援用Scala(Spark的開發語言),Java,Python三種語言編寫,熟悉其中任一門語言的都可以直接上手編寫Spark程式,可謂非常方便。
Spark的執行架構
Spark的一個最大特點就是它的叢集式/分散式計算,就是它可以將一個大任務分解成很小任務,交給很多臺機器去分別完成,最後彙總。就是“人多力量大”的道理。
而它要完成這種分散式的計算,就需要有一套標準的邏輯去負責分解、分配任務,以及蒐集最後的處理結果,這些就是通過以下的架構來實現的。
以下部分參考這裡
{
Spark架構採用了分散式計算中的Master-Slave模型。Master是對應叢集中的含有Master程序的節點,Slave是叢集中含有Worker程序的節點。Master作為整個叢集的控制器,負責整個叢集的正常執行;Worker相當於是計算節點,接收主節點命令與進行狀態彙報;Executor負責任務的執行;Client作為使用者的客戶端負責提交應用,Driver負責控制一個應用的執行,如圖1-4所示:
下面詳細介紹Spark的架構中的基本元件。
- ClusterManager:在Standalone模式中即為Master(主節點),控制整個叢集,監控Worker。在YARN模式中為資源管理器。
- Worker:從節點,負責控制計算節點,啟動Executor或Driver。在YARN模式中為NodeManager,負責計算節點的控制。
- Driver:執行Application的main()函式並建立SparkContext。
- Executor:執行器,在worker node上執行任務的元件、用於啟動執行緒池執行任務。每個Application擁有獨立的一組Executors。
- SparkContext:整個應用的上下文,控制應用的生命週期。
- RDD:Spark的基本計算單元,一組RDD可形成執行的有向無環圖RDD Graph。
- DAG Scheduler:根據作業(Job)構建基於Stage的DAG,並提交Stage給TaskScheduler。
- TaskScheduler:將任務(Task)分發給Executor執行。
- SparkEnv:執行緒級別的上下文,儲存執行時的重要元件的引用。SparkEnv內建立幷包含如下一些重要元件的引用。
- MapOutPutTracker:負責Shuffle元資訊的儲存。
- BroadcastManager:負責廣播變數的控制與元資訊的儲存。
- BlockManager:負責儲存管理、建立和查詢塊。
- MetricsSystem:監控執行時效能指標資訊。
- SparkConf:負責儲存配置資訊。
Spark的整體流程為:Client提交應用,Master找到一個Worker啟動Driver,Driver向Master或者資源管理器申請資源,之後將應用轉化為RDD Graph,再由DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler,由TaskScheduler提交任務給Executor執行。在任務執行的過程中,其他元件協同工作,確保整個應用順利執行。
}
應用場景
(本部分參考這裡)
Spark使用了記憶體分散式資料集,除了能夠提供互動式查詢外,還優化了迭代工作負載,在Spark SQL、Spark Streaming、MLlib、GraphX都有自己的子專案。在網際網路領域,Spark在快速查詢、實時日誌採集處理、業務推薦、定製廣告、使用者圖計算等方面都有相應的應用。國內的一些大公司,比如阿里巴巴、騰訊、Intel、網易、科大訊飛、百分點科技等都有實際業務執行在Spark平臺上。下面簡要說明Spark在各個領域中的用途。
快速查詢系統 基於日誌資料的快速查詢系統業務構建於Spark之上,利用其快速查詢以及記憶體表等優勢,能夠承擔大部分日誌資料的即時查詢工作;在效能方面,普遍比Hive快2~10倍,如果使用記憶體表的功能,效能將會比Hive快百倍。
實時日誌採集處理 通過Spark Streaming實時進行業務日誌採集,快速迭代處理,並進行綜合分析,能夠滿足線上系統分析要求。
業務推薦系統 使用Spark將業務推薦系統的小時和天級別的模型訓練轉變為分鐘級別的模型訓練,有效優化相關排名、個性化推薦以及熱點點選分析等。
定製廣告系統 在定製廣告業務方面需要大資料做應用分析、效果分析、定向優化等,藉助Spark快速迭代的優勢,實現了在“資料實時採集、演算法實時訓練、系統實時預測”的全流程實時並行高維演算法,支援上億的請求量處理;模擬廣告投放計算效率高、延遲小,同MapReduce相比延遲至少降低一個數量級。
使用者圖計算 利用GraphX解決了許多生產問題,包括以下計算場景:基於度分佈的中樞節點發現、基於最大連通圖的社群發現、基於三角形計數的關係衡量、基於隨機遊走的使用者屬性傳播等。
Spark程式編寫
Spark的各方面基本知識瞭解了,就可以開始嘗試編寫程式用它跑起來了。
而Spark程式的具體開發知識網上較為詳細的教程還不是很多,需要參考一些書籍來學習,這裡就推薦一本自己看過的覺得還可以的《Spark快速大資料分析》。