筆記:Spark簡介


Spark簡介

Spark是什么

  • Spark是基於內存計算的大數據並行計算框架
  • Spark是MapReduce的替代方案

Spark與Hadoop

Spark是一個計算框架,而Hadoop中包含計算框架MapReduce和分布式文件系統HDFS,Hadoop更廣泛地說還包括在其生態系統上的其他系統.

Spark的優勢

中間結果輸出

  • 基於MapReduce的計算引擎通常會將中間結果輸出到磁盤上,進行儲存和容錯.當一些查詢翻譯到MapReduce任務是,往往會產生多個Stage,而這些串聯的Stage又依賴於底層的文件系統來存儲每一個Stage的輸出結果.
  • Spark將執行模型抽象為通用的有向無環圖執行計划(Directed Acyclic Graph,DAG).這可以將多個Stage的任務串聯或者並行執行,而無須將Stage中間結果輸出到HDFS中.類似的引擎包括Dryad,Tez

數據格式和內存布局

Spark抽象出分布式內存儲存結構彈性分布式數據集RDD,進行數據存儲.RDD能支持粗粒度寫操作,但對於讀取操作,RDD可以精確到每條記錄,這使得RDD可以用來作為分布式索引.

執行策略

MapReduce在數據Shuffle之前花費了大量的時間來排序,Spark任務在Shuffle中不是所有情景都需要排序.所以支持Hash的分布式聚合,調度中采用更為通用的任務執行計划圖(DAG),每一輪次的輸出結果在內存中緩存.

任務調度的開銷

  • 傳統的MapReduce系統,如Hadoop,是為了運行常達數小時的批量作業而設計的
  • Spark采用了事件驅動的類庫AKKA來啟動任務,通過線程池復用線程來避免進程或線程啟動和切換開銷

Spark能帶來什么

打造全棧多計算范式的高效數據流水線

Spark支持復雜查詢(SQL查詢,流式計算,機器學習和圖算法)

輕量級快速處理

  • 這是由於Scala語言的簡潔和豐富的表達力
  • Spark充分利用和集成Hadoop等其他第三方組件
  • Spark通過將中間結果緩存在內存減少磁盤I/O來達到性能的提升

易於使用,Spark支持多語言

  • Spark支持通過Scala,Java,Python編寫程序
  • 同事允許在Shell中進行交互計算
  • 用戶可以利用Spark像書寫單機程序一樣編寫分布式程序

與HDFS等存儲層兼容

  • Spark可以獨立運行,除了可以運行在當下的YARN等集群管系統之外,它還可以讀取已有的任何Hadoop數據
  • 它可以運行在任何Hadoop數據源上,比如Hive,HBase,HDFS等

Spark的局限性

  • RDD模型適合的是粗粒度的全局數據並行計算,不適合細粒度的,需要異步更新的計算
  • 如果針對特定工作負載達到最優性能,還是需要使用一些其他的大數據系統

Spark生態系統BDAS

Spark

  • Spark是整個BDAS的核心組件,是一個大數據分布式編程框架,不僅實現了MapReduce的算子map函數和reduce函數的計算模型,還提供了更為豐富的算子,如filter,join,groupByKey等.
  • Spark將分布式數據集(RDD),實現了應用任務調度,RPC,序列化和壓縮,並為運行在其上的上層組件提供API.
  • 底層采用Scala這種函數式語言書寫成
  • 所提供的API深度借鑒Scala函數式的編程思想,提供與Scala類似的編程接口
  • Spark將數據在分布式環境下分區,然后將作業轉化為有向無環圖(DAG),並分階段進行DAG的調度和任務的分布式並行處理

Shark

  • Shark是構建在Spark和Hive基礎上的數據倉庫
  • Shark已經完成學術使命,終止開發,但其架構和原理仍具有借鑒意義
  • 提供了能夠查詢Hive中所儲存數據的一套SQL接口,兼容現有的Hive QL語法
  • 熟悉Hive QL和SQL的用戶可以基於Shark進行快速的Ad-Hoc,Reporting等類型的SQL查詢
  • Shark底層復用Hive的解析器,優化器以及元數據存儲和序列化接口
  • Shark將Hive QL編譯轉化為一組Spark任務,進行分布式運算

Spark SQL

  • Spark SQL提供在大數據上的SQL查詢功能
  • Spark SQL使用Catalyst做查詢解析和優化器,並在底層使用Spark作為執行引擎實現的SQL的Operator
  • 用戶可以在Spark上直接書寫SQL

Spark Streaming

  • Spark Streaming通過將流數據按指定時間片累積為RDD,然后將RDD進行批處理,進而實現大規模的流數據處理

GraphX

  • GraphX基於BSP模型,在Spark之上,封裝類似Pregel的接口,進而大規模同步全局的圖計算
  • 當用戶進行多輪迭代時,基於Spark內存計算的優勢尤為明顯

Tachyon

  • Tachyon是一個分布式內存文件系統,可以理解為內存中的HDFS
  • 為了提供更高的性能,將數據存儲剝離Java Heap
  • 用戶可以通過Tachyon實現RDD或者文件的跨應用共享,並提高容錯機制,保證數據的可靠性

Mesos

  • Mesos是一個資源管理框架
  • 提供類似於YARN的功能
  • 用戶可以在其中插件式地運行Spark,MapReduce,Tez等計算框架任務
  • Mesos對資源和任務進行隔離,並實現高效的資源任務調度

BlinkDB

  • BlinkDB是一個用於在海量數據上進行交互式SQL的近似查詢引擎
  • 允許用戶通過查詢准確性和查詢時間之間做出權衡,完成近似查詢
  • 核心思想:通過一個自適應優化框架,隨着時間的推移,從原始數據建立並維護一組多維樣本,通過一個動態樣本選擇策略,選擇一個適當大小的示例,然后基於查詢的准確性和響應時間滿足用戶查詢需求

Spark架構

  • Spark是整個BDAS的核心,各個組件通過Spark來實現對分布式並行任務處理的程序支持

Spark代碼結構

Spark Core
名稱 說明
scheduler 文件夾中含有負責整體的Spark應用,任務調度的代碼
broadcast 含有Broadcast(廣播變量)的實現代碼,API中是Java和Python API的實現
deploy 含有Spark部署與啟動運行的代碼
common 不是一個文件夾,而是代表Spark通用的類和邏輯實現
metrics 是運行時狀態監控邏輯代碼,Executor中含有Worker節點負責計算的邏輯代碼
partial 含有近似評估代碼
network 含有集群通信模塊代碼
serializer 含有存儲模塊的代碼
storage 含有存儲模塊的代碼
ui 含有監控界面的代碼邏輯,其他的代碼模塊分別是對Spark生態系統中其他組件的實現
其他
名稱 說明
streaming Spark Streaming的實現代碼
YARN Spark on YARN的部分實現代碼
praphx 含有GraphX實現代碼
interpreter 交互式Shell代碼
mllib 代表MLlib算法實現的代碼
sql 代表Sqark SQL的代碼

Spark的架構

  • Spark架構采用了分布式計算中的Master-Slave模型.Master是對應集群中的含有Master進程的節點,Slave是集群中含有Worker進程的節點
    • Master作為整個集群的控制器,負責整個集群的正常運行
    • Worker相當於是計算節點,接受主節點命令與進行狀態匯報
    • Executer負責任務的執行
    • Client作為用戶的客戶端,負責提交應用
    • Driver負責控制一個應用的執行
  • Spark集群部署后,需要在主節點和從節點分別啟動Master進程和Worker進程,對整個集群進行控制
  • 在一個Spark應用的執行過程中,Driver和Worker是兩個重要角色
    • Driver程序是應用邏輯執行的起點,負責作業的調度,即執行Task任務的分發
    • 多個Worker用來管理計算節點和創建Executor並行處理任務
    • 在執行階段,Driver會將Task和Task所依賴的file和jar序列化后傳遞給對應的Worker機器,同時Executor對相應數據分區的任務進行處理

Spark架構中的基本組件

組件名 介紹
ClusterManager 在Standalone模式中即為Master(主節點),控制整個集群,監控Master.在YARN中為資源管理器
Worker 從節點,負責控制計算節點.啟動Executor或Driver.在YARN模式中為NodeManager,負責計算節點的控制
Driver 運行Application的main()函數並創建SparkContext
Executor 執行器,在worker node上執行任務的組件,用於啟動線程池運行任務.每個Application擁有獨立的一組Executors
SparkContext 整個應用的上下文,控制應用的生命周期
RDD Spark的基本計算單元,一組RDD可形成執行的有向無環圖RDD Graph
DAG Scheduler 根據作業構建基於Stage的DAG,並提交Stage給TaskScheduler
TaskScheduler 將任務分發給Executor執行
SparkEnv 線程級別的上下文,存儲運行時的重要組件的引用

SparkEnv內創建並包含如下一些重要組件的引用

SparkEnv內創建並包含的重要組件的引用
組件 介紹
MapOutPutTracker 負責Shuffle元信息的存儲
BroadcastManager 負責廣播變量的控制與雲信息的存儲
BlockManager 負責存儲管理,創建和查找塊
MetricsSystem 監控運行時性能指標信息
SparkConf 負責存儲配置信息

Spark的整體流程

  1. Client提交應用
  2. Master找到一個Worker啟動Driver
  3. Driver向Master或者資源管理器申請資源,之后將應用轉化為RDD Grath
  4. DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler
  5. TaskScheduler提交任務給Executor執行
  6. 任務執行過程中,其他組件協同工作

Spark運行邏輯

  • 在Spark應用中,整個執行流程在邏輯上會形成有向無環圖.Action算子觸發之后,將所有累積的算子形成一個有向無環圖.
  • Action算子觸發之后,將所有累積的算子形成一個有向無環圖,然后由調度器調度該圖上的任務進行運算
  • Spark根據RDD之間不同的依賴關系切分成不同的階段,一個階段包含一系列函數執行流水線


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM