前言
本章將對Spark做一個簡單的介紹,更多教程請參考: Spark教程##本章知識點概括 - Apache Spark簡介 - Spark的四種運行模式 - Spark基於Standlone的運行流程 - Spark基於YARN的運行流程
Apache Spark是什么?
Spark是一個用來實現快速而通用的集群計算的平台。擴展了廣泛使用的MapReduce計算模型,而且高效地支持更多的計算模式,包括交互式查詢和流處理。在處理大規模數據集的時候,速度是非常重要的。Spark的一個重要特點就是能夠在內存中計算,因而更快。即使在磁盤上進行的復雜計算,Spark依然比MapReduce更加高效。
Spark重要概念
(1)Spark運行模式
目前Spark的運行模式主要有以下幾種:
local
:主要用於開發調試Spark應用程序Standlone
:利用Spark自帶的資源管理與調度器運行Spark集群,采用Master/Slave結構,為解決單點故障,可以采用Xookeeper實現高可靠(High Availability, HA)Apache Mesos
:運行在著名的Mesos資源管理框架基礎之上,該集群運行模式將資源管理管理交給Mesos,Spark只負責運行任務調度和計算Hadoop YARN
:集群運行在Yarn資源管理器上,資源管理交給YARN,Spark只負責進行任務調度和計算
Spark運行模式中Hadoop YARN的集群方式最為常用,前面一章關於Spark集群搭建就是采用的YARN模式。
(2)Spark組件(Components)
一個完整的Spark應用程序,如前面一章當中的SparkWorkdCount程序,在提交集群運行時,它涉及到如下圖所示的組件:
每個Spark應用都由一個驅動器程序(drive program)來發起集群上的各種並行操作。驅動器程序包含應用的main函數,驅動器負責創建SparkContext,SparkContext可以與不同種類的集群資源管理器(Cluster Manager),例如Hadoop YARN,Mesos進行通信,獲取到集群進行所需的資源后,SparkContext將
得到集群中工作節點(Worker Node)上對應的Executor(不同的Spark程序有不同的Executor,他們之間是相互獨立的進程,Executor為應用程序提供分布式計算以及數據存儲功能),之后SparkContext將應用程序代碼發送到各Executor,最后將任務(Task)分配給executors執行
- ClusterManager:在Standalone模式中即為Master節點(主節點),控制整個集群,監控Worker.在YARN中為ResourceManager
- Worker:從節點,負責控制計算節點,啟動Executor或Driver。在YARN模式中為NodeManager,負責計算節點的控制。
- Driver:運行Application的main()函數並創建SparkContect。
- Executor:執行器,在worker node上執行任務的組件、用於啟動線程池運行任務。每個Application擁有獨立的一組Executor。
- SparkContext:整個應用的上下文,控制應用的生命周期。
- RDD:Spark的計算單元,一組RDD可形成執行的有向無環圖RDD Graph。
- DAG Scheduler:根據作業(Job)構建基於Stage的DAG,並提交Stage給TaskScheduler。
- TaskScheduler:將任務(Task)分發給Executor。
- SparkEnv:線程級別的上下文,存儲運行時的重要組件的引用。
SparkEnv內構建並包含如下一些重要組件的引用。
1、MapOutPutTracker:負責Shuffle元信息的存儲。
2、BroadcastManager:負責廣播變量的控制與元信息的存儲。
3、BlockManager:負責存儲管理、創建和查找快。
4、MetricsSystem:監控運行時性能指標信息。
5、SparkConf:負責存儲配置信息。
Spark的整體流程
1、Client提交應用。
2、Master找到一個Worker啟動Driver
3、Driver向Master或者資源管理器申請資源,之后將應用轉化為RDD Graph
4、再由DAGSchedule將RDD Graph轉化為Stage的有向無環圖提交給TaskSchedule。
5、再由TaskSchedule提交任務給Executor執行。
6、其它組件協同工作,確保整個應用順利執行。
圖片:
Spark on Yarn流程:
1、基於YARN的Spark作業首先由客戶端生成作業信息,提交給ResourceManager。
2、ResourceManager在某一NodeManager匯報時把AppMaster分配給NodeManager。
3、NodeManager啟動SparkAppMaster。
4、SparkAppMastere啟動后初始化然后向ResourceManager申請資源。
5、申請到資源后,SparkAppMaster通過RPC讓NodeManager啟動相應的SparkExecutor。
6、SparkExecutor向SparkAppMaster匯報並完成相應的任務。
7、SparkClient會通過AppMaster獲取作業運行狀態。
參考文檔
問題
- 針對SparkContext和Drive program還沒有解釋清楚
- 關於Driver向Master請求資源這一塊還沒搞懂
- 關於Spark的整體流程圖還是不太准確,以后找到好的再補上