[大數據技術原理與應用筆記] 第10講. Spark

10.1 Spark與Hadoop的對比

Spark 相比於 Hadoop MapReduce的優缺點
  • Spark的計算模式也屬於MapReduce,但不限於Map和Reduce操做,提供了多種數據集操做類型,編程模式比Hadoop MapReduce更靈活
  • Spark 基於DGA(有向無環圖)的任務調度執行機制,要優於Hadoop MapReduce 的迭代執行機制
  • 提供了內存計算,可將中間結果放到內存,對於迭代效率更高,而Hadoop MapReduce 計算的中間結果須要緩存到硬盤,IO開銷大

10.3 Spark 運行架構

基本概念
  • RDD:Resillient Distributed Dataset(彈性分佈式數據集)的簡稱,是分佈式內存的一個抽象概念,提供了一種高度受限的共享內存模型.
  • DAG:有向無環圖,反映RDD之間的依賴關係
  • Executor:一個做業會被分爲多個task。executor是運行在工做結點的一個進程,負責運行task。
  • Application:用戶編寫的Spark 應用程序.
  • Task:運行在executor上的工做單元
  • Job:一個Job包含多個RDD,及做用在相應RDD上的各類操做.一般一個aoolication 包含多個job
  • stage: 是job的基本調度單位,一個job包含多組task,每組task被稱爲stage,或者被稱爲TaskSet,表明了一組關聯的,相互直接沒有shuffle依賴關係的任務組成的任務集。
運行架構

微信截圖_20200218104155.png
Executor 運行在Worker Node 上java

與 MapReduce相比的優勢:編程

  1. 在一個Excutor裏,同時啓動多個線程執行相關Task,而MapReduce以進程執行任務,因此Spark的啓動開銷小
  2. Excutor裏有一個BlockManager的存儲模塊,將內存和磁盤共同做爲存儲設備,優先使用內存,當內存不足時再溢寫到磁盤,有效減小IO開銷
Spark 各類概念之間的相互關係

微信截圖_20200218104913.png

Drive Program 至關於管家緩存

架構執行Application的大概過程

微信截圖_20200218105218.png

Spark 運行基本流程

微信截圖_20200218111437.png

  1. 爲應用構建起基本的運行環境,即由Driver建立一個SparkContext進行資源的申請,任務的分配和監控.
  2. 資源管理器爲Executor分配資源,啓動Executor,Executor不斷地向資源管理器彙報資源的使用狀況.
  3. SparkContext 根據RDD依賴關係生成DAG圖,並將DAG圖提交給DAG Scheduler分解爲stage,把一個個TaskSet 交給底層做業調度器Task Scheluder。Executor向Task Scheluder 申請Task,Task Scheluder 將Task分配給Executor 並提供相應的應用程序代碼。
  4. Executor執行結束後把結果反饋給Task Scheluder,而後Task Scheluder 反饋給DAG Scheduler,運行完畢後寫入數據並釋放資源.
Spark 運行架構特色

微信截圖_20200218113417.png

RDD

微信截圖_20200218114657.png
RDD 使得Spark運行效率高於MapReduce的緣由/RDD的特性:微信

  • 高效的容錯性。一般的容錯機制經過日誌記錄,恢復日誌中記錄的操做來恢復數據,而這不適合數據密集性將會帶來巨大的開銷。RDD的錯誤恢復只須要經過該RDD在DAG中的上一個RDD再作一次轉換便可。
  • 中間結果持久化到內存,數據在內存中多個RDD操做之間傳遞,避免了沒必要要的磁盤開銷
  • 存放的是java對象,避免了序列化和反序列化(存到磁盤須要序列化)
RDD 依賴關係
  • 窄依賴:一個父RDD的分區對應一個子RDD的分區;或多個RDD的分區對應一個子RDD的分區
  • 寬依賴: 一個父RDD的一個分區對應一個子RDD的多個分區
Stage 劃分
  • DAG中進行反向解析,遇到寬依賴就斷開
  • 遇到窄依賴就把當前的RDD加入到Stage中
  • 將窄依賴儘可能劃分到同一個stage中,能夠實現流水線計算,從而使得數據能夠在內存中之間交換,避免了IO開銷

例子:
微信截圖_20200218121123.png架構

Stage 類型:分佈式

ShuffleMapStage
  • 不是最終的stage,在他以後還有其餘stage,因此它的輸出必定會通過shuffle過程,並做爲後續stage的輸入
  • 以Shuffle做爲輸出邊界,輸入邊界能夠是從外部獲取數據也能夠是另外一個ShuffleMapStage的輸出
  • 一個Job裏可能有改類型的Stage,也可能沒有(一次轉換計算就結束了不須要其餘stage,這種爲ResultStage)
ResultStage
  • 最終的Stage,沒有輸出,而是直接產生結果或存儲
  • 這種stage直接輸出結果,輸入邊界能夠是直接輸入也能夠是ShuffleMapStage的輸出
  • 一個Job裏必定包含至少一個ResultStage
RDD運行過程

微信截圖_20200218122531.png

相關文章
相關標籤/搜索