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的整體流程
- Client提交應用
- Master找到一個Worker啟動Driver
- Driver向Master或者資源管理器申請資源,之后將應用轉化為RDD Grath
- DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler
- TaskScheduler提交任務給Executor執行
- 任務執行過程中,其他組件協同工作
Spark運行邏輯
- 在Spark應用中,整個執行流程在邏輯上會形成有向無環圖.Action算子觸發之后,將所有累積的算子形成一個有向無環圖.
- Action算子觸發之后,將所有累積的算子形成一個有向無環圖,然后由調度器調度該圖上的任務進行運算
- Spark根據RDD之間不同的依賴關系切分成不同的階段,一個階段包含一系列函數執行流水線