Spark入門(一)——Spark的“前世今生”

Spark簡介

Spark 是一個用來實現快速而通用的集羣計算的平臺。
在速度方面,Spark 擴展了廣泛使用的 MapReduce 計算模型,而且高效地支持更多計算模式,包括交互式查詢和流處理。在處理大規模數據集時,速度是非常重要的。速度快就意味着我們可以進行交互式的數據操作,否則我們每次操作就需要等待數分鐘甚至數小時。Spark 的一個主要特點就是能夠在內存中進行計算,因而更快。不過即使是必須在磁盤上進行的複雜計算,Spark 依然比 MapReduce 更加高效。
總的來說,Spark 適用於各種各樣原先需要多種不同的分佈式平臺的場景,包括批處理、迭代算法、交互式查詢、流處理。通過在一個統一的框架下支持這些不同的計算,Spark使我們可以簡單而低耗地把各種處理流程整合在一起。而這樣的組合,在實際的數據分析過程中是很有意義的。不僅如此,Spark 的這種特性還大大減輕了原先需要對各種平臺別管理的負擔。Spark 所提供的接口非常豐富。除了提供基於 Python、Java、Scala 和 SQL 的簡單易用的API 以及內建的豐富的程序庫以外,Spark 還能和其他大數據工具密切配合使用。例如,Spark 可以運行在 Hadoop 集羣上,訪問包括 Cassandra 在內的任意 Hadoop 數據源。

  • 總結

Spark是一個快如閃電的統一分析引擎(計算框架)用於大規模數據集的處理。Spark在做數據的批處理計算,計算性能大約是Hadoop MapReduce的10~100倍,因爲Spark使用比較先進的基於DAG 任務調度,可以將一個任務拆分成若干個階段,然後將這些階段分批次交給集羣計算節點處理。

  • MapReduce VS Spark

MapReduce作爲第一代大數據處理框架,在設計初期只是爲了滿足基於海量數據級的海量數據計算的迫切需求。自2006年剝離自Nutch(Java搜索引擎)工程,主要解決的是早期人們對大數據的初級認知所面臨的問題。

在這裏插入圖片描述

整個MapReduce的計算實現的是基於磁盤的IO計算,隨着大數據技術的不斷普及,人們開始重新定義大數據的處理方式,不僅僅滿足於能在合理的時間範圍內完成對大數據的計算,還對計算的實效性提出了更苛刻的要求,因爲人們開始探索使用Map Reduce計算框架完成一些複雜的高階算法,往往這些算法通常不能通過1次性的Map Reduce迭代計算完成。由於Map Reduce計算模型總是把結果存儲到磁盤中,每次迭代都需要將數據磁盤加載到內存,這就爲後續的迭代帶來了更多延長。

2009年Spark在加州伯克利AMP實驗室誕生,2010首次開源後該項目就受到很多開發人員的喜愛,2013年6月份開始在Apache孵化,2014年2月份正式成爲Apache的頂級項目。Spark發展如此之快是因爲Spark在計算層方面明顯優於Hadoop的Map Reduce這磁盤迭代計算,因爲Spark可以使用內存對數據做計算,而且計算的中間結果也可以緩存在內存中,這就爲後續的迭代計算節省了時間,大幅度的提升了針對於海量數據的計算效率。
在這裏插入圖片描述
Spark也給出了在使用MapReduce和Spark做線性迴歸計算(算法實現需要n次迭代)上,Spark的速率幾乎是MapReduce計算10~100倍這種計算速度。
在這裏插入圖片描述
不僅如此Spark在設計理念中也提出了One stack ruled them all戰略,並且提供了基於Spark批處理至上的計算服務分支例如:實現基於Spark的交互查詢、近實時流處理、機器學習、Grahx 圖形關係存儲等。

從圖中不難看出Apache Spark處於計算層,Spark項目在戰略上啓到了承上啓下的作用,並沒有廢棄原有以hadoop爲主體的大數據解決方案。因爲Spark向下可以計算來自於HDFS、HBase、Cassandra和亞馬遜S3文件服務器的數據,也就意味着使用Spark作爲計算層,用戶原有的存儲層架構無需改動。

計算流程

因爲Spark計算是在MapReduce計算之後誕生,吸取了MapReduce設計經驗,極大地規避了MapReduce計算過程中的詬病,先來回顧一下MapReduce計算的流程。
在這裏插入圖片描述
總結一下幾點缺點:

1)MapReduce雖然基於矢量編程思想,但是計算狀態過於簡單,只是簡單的將任務分爲Map state和Reduce State,沒有考慮到迭代計算場景。
2)在Map任務計算的中間結果存儲到本地磁盤,IO調用過多,數據讀寫效率差。
3)MapReduce是先提交任務,然後在計算過程中申請資源。並且計算方式過於笨重。每個並行度都是由一個JVM進程來實現計算。

通過簡單的羅列不難發現MapReduce計算的詬病和問題,因此Spark在計算層面上借鑑了MapReduce計算設計的經驗,提出了DGASchedule和TaskSchedual概念,打破了在MapReduce任務中一個job只用Map State和Reduce State的兩個階段,並不適合一些迭代計算次數比較多的場景。因此Spark 提出了一個比較先進的設計理念,任務狀態拆分,Spark在任務計算初期首先通過DGASchedule計算任務的State,將每個階段的Sate封裝成一個TaskSet,然後由TaskSchedual將TaskSet提交集羣進行計算。可以嘗試將Spark計算的流程使用一下的流程圖描述如下:

在這裏插入圖片描述

相比較於MapReduce計算,Spark計算有以下優點:

1)智能DAG任務拆分,將一個複雜計算拆分成若干個State,滿足迭代計算場景

2)Spark提供了計算的緩存和容錯策略,將計算結果存儲在內存或者磁盤,加速每個state的運行,提升運行效率

3)Spark在計算初期,就已經申請好計算資源。任務並行度是通過在Executor進程中啓動線程實現,相比較於MapReduce計算更加輕快。

目前Spark提供了Cluster Manager的實現由Yarn、Standalone、Messso、kubernates等實現。其中企業常用的有Yarn和Standalone方式的管理。

  • Application就是你寫的代碼。
  • Driver節點上的Driver程序運行的是main函數
  • Worker節點就是工作節點,上面運行Executor進程。
  • Executor進程負責運行Task。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章