1. 程式人生 > >Spark內部機制學習筆記

Spark內部機制學習筆記

1 總體框架結構圖

Spark應用程式架構
由上圖我們可以看到Spark應用程式架構主要由Driver Program和Executor構成,Driver負責執行main()和建立SparkContext,Executor主要負責執行Task任務。

2 各大重要元件和概念

2.1 重要概念

概念 功能 模型 備註
Application 使用者定義的Spark應用程式,使用者提交後,Spark會為應用分配資源,排程和執行相關任務 .
RDD Graph Spark會分析Spark應用,將程式中所涉及的RDD按照一定的依賴關係構建RDD Graph,也就是根據運算元來構建有向無環圖,每個RDD Graph都會轉化成一個Job
Job
    一個App中可以包含多個Job,每個Job都是由一個RDD Graph轉化而來的
    - 由Action運算元觸發
.
Stage
    每個Job會根據RDD之間的寬依賴(Shuffle Dependency)來劃分成多個Stage,每一個Stage中包含一組Task(也就是TaskSet)
    - 每個Stage中的Task型別都是相同的
.
Task
    一個分割槽對應一個Task
    - Task執行RDD中對應的運算元,Task被封裝TaskRunner後放入Executor的執行緒中來執行,並由TaskRunner來進行排程
    - Task型別有ShuffleMapTask和ResultTask
.
Worker 可以執行App程式碼的節點,如Yarn中NodeManager .
DAGScheduler 用來構建基於Stage的有向無環圖,劃分的依據是根據RDD之間的寬依賴 .
TaskScheduler
    將TaskSet提交給Executor去執行
    - 維護TaskSet的執行狀態標籤,負責Task的失效重執行
.

2.2 相關元件

元件 功能 模型 備註
Driver
    執行Application的main函式並建立SparkContext
    - SparkContext的作用就是與Cluster Manager通訊,進行資源申請、任務的排程等。
.
Executor
    某個App執行在Worker上的一個程序,用於執行App的Task
    - 每個App都有獨立的Executor,Executor上執行的Task取決於分配的core數
.
Cluster Manager 資源排程服務,用於資源的分配和排程,有standalone、mesos和yarn三種模式 .

3 應用的提交執行流程

3.1 執行模式

1)Spark應用的執行模式有以下幾種:

  • local[n]:本地模式
  • standalone:使用spark內部的資源管理器,master-slaves架構
  • mesos : Apache下的一個資源管理框架
  • yarn : Hadoop下的一個資源管理框架

2)根據Driver的執行位置來劃分有以下兩種執行模式:

  • Cluster:Driver和Executor執行在叢集中的Worker上
  • Client:Driver執行在客戶端上,Executor執行在Worker上

3)命令列

  • spark-shell:bin/spark-shell –master yarn –deploy-mode client(yarn的client模式)
  • spark-submit:spark-shell底層也是呼叫spark-submit,如果你想知道它有什麼引數,可以直接在spark目錄下輸入 spark-submit來檢視

3.2 流程

這裡我們就以 Spark On Yarn 為例來說明

3.2.1 Yarn-Client 模式

流程如下:
1. 在客戶端通過spark-submit向Yarn提交Application
2. 應用在Client啟動Driver,建立SparkContext並進行初始化
3. ResourceManger為應用申請一個Container來啟動Application Master,用來與Client中的SparkContext進行通訊。
4. Application Master即承擔起了為應用申請資源執行Executor的責任,一旦申請到資源,那麼就會在指定的NodeManager的Container上建立Executor程序,Executor會向SparkContext註冊,保持通訊
5. SparkContext會根據任務所需資源,資料本地性等條件指定Task的執行在哪個Executor上,將Task分發到指定Executor並開始執行,Executor會週期向SparkContext彙報任務執行情況
6. 一旦所有任務執行完畢,SparkContext會向ResourceManger申請登出自己並關閉

3.2.2 Yarn-Cluster 模式

流程如下:
1. 在客戶端通過spark-submit向Yarn提交Application
2. ResourceManger為應用申請一個Container來啟動Application Master,並且在Application Master進行SparkContext等初始化。
3. Application Master即承擔起了為應用申請資源執行Executor的責任,一旦申請到資源,那麼就會在指定的NodeManager的Container上建立Executor程序,Executor會向SparkContext註冊,保持通訊
4. Applicaiton Master會根據任務所需資源,資料本地性等條件指定Task的執行在哪個Executor上,將Task分發到指定Executor並開始執行,Executor會週期向Applicaiton Master彙報任務執行情況
5. 一旦所有任務執行完畢,Applicaiton Master會向ResourceManger申請登出自己並關閉

4 Spark的讀寫流程

4.1 寫入流程

  1. RDD呼叫compute( )方法進行指定分割槽的寫入。
  2. CacheManager中呼叫BlockManater判斷資料是否已經寫入,如果未寫則寫入。
  3. BlockManager中資料與其他節點同步。(與副本節點通訊)
  4. BlockManager根據儲存級別寫入指定的儲存層。(儲存級別決定了資料是儲存在記憶體還是磁碟,或者是兩者結合)
  5. BlockManager向主節點彙報儲存狀態。

4.2 讀取流程

  1. RDD呼叫compute( )方法進行指定分割槽的讀取。
  2. 呼叫BlockManager的get()進行讀取
    • 在本地同步讀取資料塊,首先看能否在記憶體讀取資料塊,如果不能讀取,則看能否從Tachyon讀取資料塊,如果仍不能讀取,則看能否從磁碟讀取資料塊。
    • 如果本地沒有資料,就進行遠端讀取:遠端獲取呼叫路徑,然後getRemote呼叫doGetRemote,通過BlockManagerWorker.syncGetBlock從遠端獲取資料。

5 Spark各元件之間的通訊方式和流程

5.1 通訊框架

1.6之前

  • Spark在模組間通訊使用的是AKKA框架。AKKA基於Scala開發,用於編寫Actor應用。
  • Actors是一些包含狀態和行為的物件。它們通過顯式傳遞訊息來進行通訊,訊息會被髮送到它們的訊息佇列中。對訊息佇列中的訊息進行處理作出響應
  • RPC是單獨通過AKKA實現,資料以及檔案傳輸是採用netty實現,而AKKA底層也是使用Netty來實現的

1.6 後

  • 通過netty封裝了一套簡潔的類似於AKKA Actor模式的RPC介面,並逐步拋棄AKKA這個重量級框架
  • 2.0 之後,所有的網路功能模組都是通過Netty來實現的

5.2 通訊的簡單流程

  • 客戶端傳送請求訊息,經過Encoder加上頭資訊,通過網路傳送給服務端
  • 服務端收到訊息之後,經過TransportFrameDecoder進行處理,得到訊息型別和訊息體,在解析得到具體的請求資訊
  • 最後由TransportChannelHandler處理具體的請求資訊,根據訊息型別判斷是否迴應

6 Spark的容錯機制

分散式系統常用的容錯機制

  • 資料檢查點:成本高,耗費資源
  • 記錄資料的更新:耗費資源較少

Spark所採用的容錯機制是記錄資料更新和資料檢查點相結合的形式。原因如下:

  • RDD只支援粗粒度轉換,即在大量記錄上執行的單個操作。將建立RDD的一系列Lineage(即血統)記錄下來,以便恢復丟失的分割槽。也就是說當子RDD分割槽丟失時,只要重新計算它對應的父RDD分割槽就可以進行恢復,這對於窄依賴來說不存在冗餘計算。
  • 寬依賴也就是Shuffle Dependency,也就是發生在shuffle階段的依賴,如果子RDD分割槽丟失了,那麼重新計算的代價就比較大,因為有多個父RDD分割槽對應該子RDD分割槽,那麼重新計算時所有的父RDD分割槽都得重新計算,造成了計算冗餘

以下情況需要新增檢查點

  • DAG中依賴線過長,如果重算,則開銷太大
  • 在Shuffle Dependency上做CheckPoint(檢查點)獲得的收益更大

在RDD計算中,通過檢查點機制進行容錯,傳統做檢查點有兩種方式:通過冗餘資料和日誌記錄更新操作。RDD中所採用的就是通過冗餘資料來快取資料,然後對已進行冗餘操作的RDD執行刪除該祖先的RDD依賴

官方建議,做檢查點的RDD做好先快取在記憶體中,否則需要進行重新計算

7 Spark的Shuffle機制

Shuffle中文意思就是混洗,跟MapReduce中的Shuffle的思想是相同,就是資料的重新分割槽和組合

Spark的Shuffle是在stage的承接階段完成的,前面的stage會根據後面stage的分割槽數來將資料按照一定的規則分成相應的bucket,然後寫到磁碟上。後續的stage會從元資料那裡獲得指定資料的所在節點,將資料拉取本地做進一步的操作

Shuffle分為兩個階段

  • Shuffle Write :Shuffle的第一步驟,就是將前一個stage中的資料寫到磁碟,用於第二步的Fetch
    • 主要是在ShuffleMapTask中執行(runTask)方法
    • 如果設定了map端進行聚合的話,那麼會先執行資料在map的合併,減少網路傳輸
    • Consolidate Shuffle相比普通Shuffle的優勢在:普通shuffle產生的Shuffle檔案數為map任務數*reduce任務數,而Consolidate Shuffle的理論Shuffle檔案數為Spark Core數*Reducer數,而概念上C_Shuffle引入了檔案陣列,一個Bucket不再對應一個檔案,而是對應檔案中的一個segment
  • Shuffle Fetch:通過本地或者遠端抓取需要的資料到本節點進行計算,完成操作如儲存資料到指定路徑或者作為下一個Shuffle的Shuffle Write

Shuffle Aggregator並不會對所有情況下的資料進行排序,所以Aggregator分為不需要外排和需要外排兩種方式

  • 不需要外排:資料全部儲存在記憶體當中,使用AppendOnlyMap來進行資料的儲存,資料是來一個處理一個,更新到map中,所以reducer的記憶體必須足夠大,能夠儲存該分割槽的所有key和count的值
  • 需要外排:reduce型別的操作,記憶體沒辦法存放所有的key-value對,必須藉助外部磁碟

在Reduce端,各個Task會併發啟動多個執行緒同時從多個Map Task端拉取資料。由於Reduce階段的主要任務是對資料進行按組規約。也就是說,需要將資料分成若干組,以便以組為單位進行處理。大家知道,分組的方式非常多,常見的有:Map/HashTable(key相同的,放到同一個value list中)和Sort(按key進行排序,key相同的一組,經排序後會挨在一起),這兩種方式各有優缺點,第一種複雜度低,效率高,但是需要將資料全部放到記憶體中,第二種方案複雜度高,但能夠藉助磁碟(外部排序)處理龐大的資料集。Spark前期採用了第一種方案,而在最新的版本中加入了第二種方案, MapReduce則從一開始就選用了基於sort的方案。
摘抄自董西成的文章連結如下http://dongxicheng.org/framework-on-yarn/apache-spark-shuffle-details/

相關推薦

Spark內部機制學習筆記

1 總體框架結構圖 由上圖我們可以看到Spark應用程式架構主要由Driver Program和Executor構成,Driver負責執行main()和建立SparkContext,Executor主要負責執行Task任務。 2 各大重要元件和概念

201711671103《JAVA程式設計》第十二章多執行緒機制學習筆記

教材學習內容總結 1.執行緒是依附於程序的,程序是分配資源的最小單位,執行緒是比程序更小的執行單位。一個程序可以產生多個執行緒,形成多條執行線索。每條線索,即每個執行緒也有它自身的產生,存在和消亡過程,也是一個動態的概念。 2.JAVA 中的多執行緒機制:多執行緒是指一個應用程式同時存在好幾

spark 最佳實踐學習筆記

大資料的特徵4v 1、大量 2、多樣 3、快速 4、價值 如何儲存和計算大資料 大資料交易 加州大學伯克利分校AMP實驗室 spark 讀取HDFS的資料到記憶體,在記憶體中使用彈性分散式資料集RDD組織資料 支援常見的mapreduce正規化,還支援圖形計算、流計

spark 2.X學習筆記

一  課程導讀 1  課程目標          目標:熟悉Spark相關概念          目標:搭建Spark叢集          目標:編寫簡單的Spark應用程式     2 Spark概述         什麼是Spark(官網:http://spark.

JAVA 類載入機制學習筆記

JAVA 類生命週期     如上圖所示,Java類的生命週期如圖所示,分別為載入、驗證、準備、解析、初始化、使用、解除安裝。其中驗證、準備、解析這三個步驟統稱為連結。   載入:JVM根據全限定名來獲取一段二進位制位元組流,將二進位制流轉化為方法區的執行時資料結構,在記憶體中生成一個代表

Java Class類與反射機制學習筆記(一)

類的載入 當一個程式使用某一個類時,如果該類還未被載入到記憶體中,則系統會通過載入、連線、初始化三個步驟來實現對這個類的初始化。 載入 就是指將該類的 .class檔案讀入記憶體中,併為之建立一個

作業系統的記憶體對齊機制學習筆記

 資料對齊並不是作業系統的記憶體結構的一部分,而是C P U結構的一部分 是這麼理解嗎?cpu要讀取記憶體中的資料,以多少為單位進行讀取呢?以4個位元組,還是8個位元組。還是16個位元組為單位來讀取記憶體資料? 目前主要以2個位元組為單位嗎?是的。2個位元組作為對齊單位

Spark MLlib 入門學習筆記

關於邏輯迴歸的演算法原理 Spark官方文件裡有說明,另外網上也有中文翻譯文件可參考。本筆記是學習MLlib的輯迴歸API使用時一道練習題記錄,通過這道練習,可以掌握基本使用。MLLib提供了兩種演算法實現,分別是SGD梯度下降法和LBFGS。 1. 資料檔案 交通事故的

Android觸控事件傳遞機制學習筆記

1、Android 觸控事件傳遞機制 http://blog.csdn.net/awangyunke/article/details/22047987 2、Android-onInterceptTouchEvent()和onTouchEvent()總結 h

第14課:spark RDD解密學習筆記

第14課:spark RDD解密學習筆記 本期內容: 1.RDD:基於工作集的應用抽象 2.RDD內幕解密 3.RDD思考 精通了RDD,學習Spark的時間大大縮短。解決問題能力大大提高, 徹底把精力聚集在RDD的理解上,SparkStreaming、SparkSQL、

google protobuf 反射機制學習筆記

持續更新中。。。 何為反射機制 基本概念 指程式可以訪問、檢測和修改它本身狀態或行為的一種能力 程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集、模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從

Linux下驅動:分層、分離機制學習筆記

 一、分層、分離的概念         分層即把硬體相關和相對穩定的東西給抽出來,並向上提供統一的介面,每一層專注於自己的事情,比如輸入子系統。後續文章中會繼續介紹相關例子;        分離即把硬體相關和相對穩定的東西給分離開來,實際上即是bus-dev-drv模型(平

Android非同步訊息處理機制學習筆記

(一)Handler 什麼是Handler Android訊息機制的上層介面,Handler通過傳送和處理Message和Runnable物件來關聯相對應執行緒的MessageQueeu. 可

Android Activity和Intent機制學習筆記

Activity Android中,Activity是所有程式的根本,所有程式的流程都執行在Activity之中,Activity具有自己的生命週期(見http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.ht

Java中的鎖機制學習筆記

今天回顧了下java中的鎖機制,和object類中中的wait(),notify(),notifyAll();每次敲程式碼的時候老看見這幾個方法,總讓人將它們和Android中的notifyDataSetChanged()的方法想到一塊去,其實這些東西在Java

Spark學習筆記4——spark執行機制

Spark架構及執行機制 Spark執行架構包括叢集資源管理器(Cluster Manager)、執行作業任務的工作節點(Worker Node)、每個應用的任務控制節點(Driver)和每個工作節點上負責具體任務的執行程序(Executor)。其中,叢集資源管理器可以是S

android核心剖析學習筆記:AMS(ActivityManagerService)內部原理和工作機制

      一、ActivityManagerService提供的主要功能:        (1)統一排程各應用程式的Activity        (2)記憶體管理        (3)程序管理       二、啟動一個Activity的方式有以下幾種:

大資料學習筆記——Spark工作機制以及API詳解

Spark工作機制以及API詳解 本篇文章將會承接上篇關於如何部署Spark分散式叢集的部落格,會先對RDD程式設計中常見的API進行一個整理,接著再結合原始碼以及註釋詳細地解讀spark的作業提交流程,排程機制以及shuffle的過程,廢話不多說,我們直接開始吧! 1. Spark基本API解讀 首先我們寫

Spark學習筆記——文本處理技術

使用 ken ins main 最小 leg tran sparse rain 1.建立TF-IDF模型 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.mllib.lin

深入理解Java虛擬機- 學習筆記 - 虛擬機類加載機制

支持 pub eth 獲取 事件 必須 string 沒有 字節碼 虛擬機把描述類的數據從Class文件加載道內存,並對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。在Java裏,類型的加載、連接和初始化過程都是在程序