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能夠用來做爲分佈式索引.sql
執行策略
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代碼結構
名稱 |
說明 |
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內建立幷包含以下一些重要組件的引用架構
組件 |
介紹 |
MapOutPutTracker |
負責Shuffle元信息的存儲 |
BroadcastManager |
負責廣播變量的控制與雲信息的存儲 |
BlockManager |
負責存儲管理,建立和查找塊 |
MetricsSystem |
監控運行時性能指標信息 |
SparkConf |
負責存儲配置信息 |
Spark的總體流程
- Client提交應用
- Master找到一個Worker啓動Driver
- Driver向Master或者資源管理器申請資源,以後將應用轉化爲RDD Grath
- DAGScheduler將RDD Graph轉化爲Stage的有向無環圖提交給TaskScheduler
- TaskScheduler提交任務給Executor執行
- 任務執行過程當中,其餘組件協同工做
Spark運行邏輯
- 在Spark應用中,整個執行流程在邏輯上會造成有向無環圖.Action算子觸發以後,將全部累積的算子造成一個有向無環圖.
- Action算子觸發以後,將全部累積的算子造成一個有向無環圖,而後由調度器調度該圖上的任務進行運算
- Spark根據RDD之間不一樣的依賴關係切分紅不一樣的階段,一個階段包含一系列函數執行流水線