天天看點

大資料開發之Spark 基礎入門學習

叢集相關

Cluster Manager指的是在叢集上擷取資源的外部服務,為每個spark application在叢集中排程和配置設定資源的元件,目前有三種類型:

  • Standalone:Spark 原生的資源管理,由 Master 負責資源的配置設定
  • Apache Mesos:與 Hadoop MapReduce 相容性良好的一種資源排程架構
  • Hadoop Yarn:主要是指的 Yarn 中的 ResourceManager

Worker 指叢集中的工作節點,啟動并運作executor程序,運作大資料教育訓練​作業代碼的節點

  • standalone模式下:Worker程序所在節點
  • yarn模式下: yarn的nodemanager程序所在的節點

Deploy Mode 分為兩種模式,client和cluster,差別在于driver運作的位置

  • Client模式下driver運作在送出spark作業的機器上,
  • 可以實時看到詳細的日志資訊
  • 友善追蹤和排查錯誤,用于測試
  • cluster模式下,spark application送出到cluster manager,cluster manager(比如master)負責在叢集中某個節點上,啟動driver程序,用于生産環境
  • 通常情況下driver和worker在同一個網絡中是最好的,而client很可能就是driver worker分開布置,這樣網絡通信很耗時,cluster沒有這樣的問題

Spark分布式計算組成

Application

  • 使用者編寫的Spark程式,通過一個有main方法的類執行,完成一個計算任務的處理。
  • 它是由一個Driver程式和一組運作于Spark叢集上的Executor組成

Driver

  • 運作main方法的Java虛拟機程序負責
  • 監聽spark application的executor程序發來的通信和連接配接
  • 将工程jar發送到所有的executor程序中
  • driver排程task給executor執行
  • Driver與Cluster Manager、Worker協作完成
  • Application程序的啟動
  • DAG劃分
  • 計算任務封裝
  • 配置設定task到executor上
  • 計算資源的配置設定等排程執行作業等
  • Driver排程task給executor執行,是以driver最好和spark叢集在一片網絡内,便以通信

Executor

  • 運作在worker節點上,負責執行作業的任務,并将資料儲存在記憶體或磁盤中
  • 每個spark application,都有屬于自己的executor程序,spark application不會共享一個executor程序
  • executor在整個spark application運作的生命周期内,executor可以動态增加/釋放
  • executor使用多線程運作SparkContext配置設定過來的task,來一批task就執行一批

使用者操作spark的入口

SparkContext是Spark的入口,負責連接配接Spark叢集,建立RDD,累積量和廣播量等

  • SparkContext是Spark的對外接口,負責向調用者提供Spark的各種功能
  • driver program通過SparkContext連接配接到叢集管理器來實作對叢集中任務的控制
  • 每個JVM隻有一個SparkContext,一台伺服器可以啟動多個JVM

SparkSession

  • The entry point to programming Spark with the Dataset and DataFrame API.
  • 包含了SQLContext、HiveContext、sparkcontext

Spark計算切分相關

Job

  • 一個spark application可能會被分為多個job,每次調用Action時,邏輯上會生成一個Job
  • 一個Job包含了一個或多個Stage

Stage

  • 每個job都會劃分為一個或多個stage(階段),每個stage都會有對應的一批task(即一個taskset),配置設定到executor上去執行
  • Stage包括兩類
  • ShuffleMapStage
  • ResultStage

TaskSet

  • 一組關聯的,但互相之間沒有Shuffle依賴關系的Task集合
  • Stage可以直接映射為TaskSet,一個TaskSet封裝了一次需要運算的、具有相同處理邏輯的Task,
  • 這些Task可以并行計算,粗粒度的排程是以TaskSet為機關的。
  • 一個stage對應一個taskset

Task

  • driver發送到executor上執行的計算單元,每個task負責在一個階段(stage),處理一小片資料,計算出對應的結果
  • Task是在實體節點上運作的基本機關,Task包含兩類
  • ShuffleMapTask => 對應于Stage中ShuffleMapStage中的一個執行基本單元
  • ResultTask => 對應于Stage中ResultStage中的一個執行基本單元

Spark其他重要部分

資料結構

  • RDD
  • DataFrame 引入了schema和off-heap
  • DataSet 整合了rdd和dataframe的優點,支援結構化和非結構化資料,采用堆外記憶體存儲,gc友好

核心排程器

  • DAGScheduler 根據Job建構基于Stage的DAG,并送出Stage給TaskScheduler。
  • SparkEnv Spark 公共服務們互相互動,用來給 Spark 應用程式建立分布式計算平台的運作時環境
  • TaskScheduler 将Taskset送出給Worker node叢集運作并傳回結果。

Spark排程

送出方式

  • yarn-cluster模式,用于生産模式,driver運作在nodeManager,沒有網卡流量激增問題,但檢視log麻煩,調試不友善
  • Yarn-client模式,yarn-client用于測試,driver運作在本地用戶端,負責排程application,會與yarn叢集産生超大量的網絡通信,進而導緻網卡流量激增,yarn-client可以在本地看到所有log,友善調試
  • yarn-client vs yarn-cluster
  • yarn-client下,driver運作在spark-submit送出的機器上,ApplicationMaster隻是相當于一個ExecutorLauncher,僅僅負責申請啟動executor;driver負責具體排程
  • yarn-cluster下,ApplicationMaster是driver,ApplicationMaster負責具體排程

Spark通用任務執行過程

  • 使用者通過 spark-submit 腳本送出應用
  • spark-submit 腳本啟動Driver,調用使用者定義的 main() 方法建構sparkConf和sparkContext對象,在sparkContext入口做了三件事,建立了
  • sparkEnv對象
  • TaskScheduler
  • DAGScheduler
  • Driver與cluster manager通信,申請資源以啟動Executor;
  • cluster manager為Driver啟動Executor;
  • 在使用者應用中代碼遇到對RDD的action算子操作的時候,觸發一個job,這時就會
  • 調用DAGScheduler對象進行Stage劃分,将劃分好的stage按照分區生成一個一個的task,并且封裝到TaskSet對象中
  • TaskSet送出到TaskScheduler,TaskScheduler按照送出過來的TaskSet,拿到一個序列化器,将TaskSet序列化,将序列化好的Task封裝并且送出到worker
  • 任務在Executor中進行計算并儲存結果;
  • 如果Driver的 main() 方法退出,或者調用了SparkContext.stop(),Driver會終止Executor,并且通過叢集管理器釋放資源。

spark 送出過程分析standalone

  • SparkContext連接配接到Master,向Master注冊并申請資源
  • Master根據資源申請要求和Worker心跳周期内報告的資訊決定在哪個Worker上配置設定資源,然後在該Worker上擷取資源,然後啟動StandaloneExecutorBackend
  • StandaloneExecutorBackend向SparkContext注冊,建立Executor線程池
  • SparkContext将Applicaiton代碼發送給StandaloneExecutorBackend
  • SparkContext解析Applicaiton代碼,建構DAG圖,
  • 送出給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在擷取外部資料和shuffle之前産生)
  • 以Stage(或者稱為TaskSet)送出給Task Scheduler,
  • Task Scheduler負責将Task配置設定到相應的Worker,最後送出給StandaloneExecutorBackend執行
  • StandaloneExecutorBackend會建立Executor線程池,開始執行Task,并向SparkContext報告,直至Task完成。
  • 所有Task完成後,SparkContext向Master登出,釋放資源。

繼續閱讀