Spark知識點總結

Spark知識點總結

1.Spark基本架構

在這裏插入圖片描述

  • Cluster Manager : Spark的集羣管理器, 主要負責對整個集羣資源的分配與管理. Cluster Manager分配的資源屬於一級資源, 它將各個Worker上的內存, CPU分配給Application, 但不負責對Executor的資源分配. 在standalone模式下即爲Master主節點, 控制整個集羣, 監控Worker.
  • Worker: Spark的工作節點. 主要負責管理本節點. 1.將自己的內存, CPU等資源通過註冊機制告知Cluster Manager. 2.創建Executor, 並分配資源給Executor. 3.同步資源信息, Executor信息給Cluster Manager.
  • Executor: 執行器, 是爲某個Application運行在Worker上的JVM進程. 負責任務的執行, 與Worker, Driver的信息同步
  • Driver: Application的驅動程序, Application通過Driver與Cluster Manager, Worker進行通信. Driver可以運行在Application中, 也可以由Application提交給Cluster Manager, 並由Cluster Manager安排Worker運行
  • Application: 用戶編寫的Spark程序. Application通過Spark的API進行RDD的轉換和DAG的構建, 通過Driver將Application註冊到Cluster Manager. Cluster Manager會根據Application的資源需求, 通過一級分配將Executor, 內存, CPU分配給Application. Driver通過二級分配將Executor等資源分配給每一個任務. Application最後通過Driver告訴Executor運行任務

2.Spark RDD

Resilient Distributed Datasets, 彈性分佈式數據集. 是分佈式內存的一種抽象概念, 是隻讀的記錄分區的集合, 能橫跨集羣的所有節點進行並行計算, 是一種基於工作集的應用抽象
在這裏插入圖片描述
RDD的幾個屬性:

  • 1.一組分片(Partition): 數據集的基本組成單位. 對於RDD來說, 每個分片都會被一個計算任務(Task)處理, 分區的數量決定了並行計算的粒度. RDD的並行度默認從父RDD傳遞給子RDD. 默認情況下, HDFS上的一個數據分片(Block)就是一個partition. 也可以在創建RDD的時候指定分片個數.
  • 2.一個作用於每個分片的函數: RDD中的計算是以分片爲單位的, 每個RDD都會實現compute函數, RDD的分片是並行計算的.
  • 3.RDD間的依賴關係: RDD的每次轉換都會生成一個新的RDD, 所以RDD之間就會形成流水線式的依賴關係. 在部分分區數據丟失時, 可以通過RDD間的依賴關係重新計算丟失的分區數據, 而不用對RDD的所有分區重新計算.
  • 4.一個Partitioner: RDD的分片函數, 只有key-value形式的RDD纔會有Partitioner. Partitioner不止決定了RDD本身的分片數量, 也決定了parent RDD shuffle輸出時的分片數量.
  • 5.一個存儲每個Partition的優先位置列表(preferred location): 對於一個HDFS文件來說, 這個列表保存的就是每個partition所在的塊的位置. Spark在進行任務調度的時候, 會儘可能地將計算任務分配到其所要處理的數據塊的存儲位置(移動數據不如移動計算)

對於 RDD 可以有兩種操作算子: 轉換(Transformation)與行動(Action)

  • 轉換(Transformation): Transformation操作是延遲計算的, 也就是說從一個RDD轉換生成另一個RDD的轉換操作不是馬上執行, 需要等到Action操作的時候纔會真正觸發運算.
  • 行動(Action): Action算子會觸發Spark提交作業(Job), 並將數據輸出Spark系統.

RDD的創建方式

  • 1.從Hadoop文件系統(HDFS)創建
  • 2.從父RDD轉換得到新RDD
  • 3.通過parallelize或makeRDD將單機數據創建爲分佈式RDD

RDD處理流程
在這裏插入圖片描述

  • 1.創建RDD對象
  • 2.DAGScheduler模塊介入運算, 計算RDD間的依賴關係, RDD間的依賴關係形成了DAG
  • 3.每一個Job被劃分爲多個stage的task, 劃分stage的主要依據是當前計算因子的輸入是否是確定的, 如果是則將其分在同一個Stage, 避免多個Stage間的消息傳遞開銷.將TaskSet交由TaskScheduler, Cluster Manager再分配給Worker資源, 並從SparkContext獲取Task執行.

3.Spark運行流程

在這裏插入圖片描述

  • 1.構建Spark Application的運行環境(啓動Driver), Driver向資源管理器(可以是Standalone, Mesos或YARN)註冊並申請Executor資源.
  • 2.資源管理器分配Executor並啓動StandaloneExecutorBackend, 運行情況隨着心跳發送到資源管理器上
  • 3.Driver構建DAG, 將DAG分解成多個Stage, 並把TaskSet發送給TaskScheduler, Executor向SparkContext申請Task
  • 4.TaskScheduler將Task發送給Executor運行同時Driver將程序代碼發送給Executor
  • 5.Task在Executor上運行, 運行完畢釋放所有資源

Spark的運行特點:

  • 每個Application獲取專屬的executor進程, 該進程在Application期間一直駐留, 並以多線程方式運行tasks. 這種Application隔離機制是有優勢的. 從調度角度看, 每個Driver調度它自己的任務, 且不同的Application運行在不同的JVM中. 但這也意味着不同的Spark Application間不能跨應用程序共享數據
  • 提交SparkContext的Client應該靠近Worker節點.因爲Spark運行期間SparkContext和Executor間有大量的信息交換.
  • Task採用了數據本地性和推測執行的優化機制.

4.ShuffleDependency和NarrowDependency

  • 窄依賴是指每一個父RDD的Partition只會被一個子RDD的Partition使用(一子一親)或者一個子RDD的Partition使用多個父RDD的Partiton(一子多親)
  • 寬依賴是指多個子RDD的Partition會使用同一個父RDD的Partition(多子一親)

在這裏插入圖片描述
窄依賴因爲有shuffle操作, 需要跨網絡拉取數據, 比較耗資源. 例如reduceByKey grupByKey combineByKey,sortByKey, join(no copartition)
窄依賴可以直接在同一個節點完成轉換, 速度比較快. 例如filter map flatmap mapPartitions

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章