2021-05-12 14:32:11
Spark原始碼分析之SparkContext概述
本篇文章就要根據原始碼分析SparkContext所做的一些事情,用過Spark的開發者都知道SparkContext是編寫Spark程式用到的第一個類,足以說明SparkContext的重要性;這裡先摘抄SparkContext原始碼注釋來 簡單介紹介紹SparkContext,注釋的第一句話就是說SparkContext為Spark的主要入口點,簡明扼要,如把Spark叢集當作伺服器端那Spark Driver就是用戶端,SparkContext則是用戶端的核心;如注釋所說 SparkContext用於連線Spark叢集、建立RDD、累加器(accumlator)、廣播變數(broadcast variables),所以說SparkContext為Spark程式的根本都不為過,這裡使用的Spark版本為2.0.1;
圖片來自Spark官網,可以看到SparkContext處於DriverProgram核心位置,所有與Cluster、Worker Node互動的操作都需要SparkContext來完成;
SparkContext相關元件
1、SparkConf
SparkConf為Spark設定類,設定已鍵值對形式儲存,封裝了一個ConcurrentHashMap類範例settings用於儲存Spark的設定資訊;設定項包括:master、appName、Jars、ExecutorEnv等等;
2、SparkEnv
SparkEnv可以說是Context中非常重要的類,它維護著Spark的執行環境,包含有:serializer、RpcEnv、block Manager、map output tracker、etc等;所有的執行緒都可以通過SparkCotext存取到同一個SparkEnv物件;SparkContext通過SparkEnv.createDriverEnv建立SparkEnv範例;在SparkEnv中包含了如下主要物件:
SecurityManager:用於對許可權、賬號進行管理、Hadoop YARN模式下的證書管理等;
RpcEnv:為Rpc環境的封裝,之前使用的是Akka現在預設已經使用了Netty作為Spark的Rpc通訊框架,Spark中有RpcEnvFactory trait特質預設實現為NettyRpcEnvFactory,在Factory中預設使用了Jdk的Serializer作為序列化工具;
SerializerManager:用於管理Spark元件的壓縮與序列化;
BroadcastManager:用與管理廣播物件,預設使用了TorrentBroadcastFactory廣播工廠;
MapOutputTracker:跟蹤Map階段結果的輸出狀態,用於在reduce階段獲取地址與輸出結果,如果當前為Driver則建立MapOutputTrackerMaster物件否則建立的是MapOutputTrackerWorker兩者都繼承了MapOutputTracker類;
ShuffleManager:用於管理遠端和本地Block資料shuffle操作,預設使用了SortShuffleManager範例;
MemoryManager:用於管理Spark的記憶體使用策略,有兩種模式StaticMemoryManager、UnifiedMemoryManager,第一種為1.6版本之前的後面那張為1.6版本時引入的,當前模式使用第二種模式;兩種模式區別為粗略解釋為第一種是靜態管理模式,而第二種為動態分配模式,execution與storage之間可以相互“借”記憶體;
BlockTransferService:塊傳輸服務,預設使用了Netty的實現,用於獲取網路節點的Block或者上傳當前結點的Block到網路節點;
BlockManagerMaster:用於對Block的協調與管理;
BlockManager:為Spark儲存系統重要組成部分,用於管理Block;
MetricsSystem:Spark測量系統;
3、LiveListenerBus
非同步傳遞Spark事件監聽與SparkListeners監聽器的註冊;
4、JobProgressListener
JobProgressListener監聽器用於監聽Spark中任務的進度資訊,SparkUI上的任務資料既是該監聽器提供的,監聽的事件包括有,Job:active、completed、failed;Stage:pending、active、completed、skipped、failed等;JobProgressListener最終將註冊到LiveListenerBus中;
5、SparkUI
SparkUI為Spark監控Web平台提供了Spark環境、任務的整個生命週期的監控;
6、TaskScheduler
TaskScheduler為Spark的任務排程器,Spark通過他提交任務並且請求叢集排程任務;TaskScheduler通過Master匹配部署模式用於建立TashSchedulerImpl與根據不同的叢集管理模式(local、local[n]、standalone、local-cluster、mesos、YARN)建立不同的SchedulerBackend範例;
7、DAGScheduler
DAGScheduler為高階的、基於stage的排程器,為提交給它的job計算stage,將stage作為tasksets提交給底層排程器TaskScheduler執行;DAGScheduler還會決定著stage的最優執行位置;
8、ExecutorAllocationManager
根據負載動態的分配與刪除Executor,可通過ExecutorAllcationManager設定動態分配最小Executor、最大Executor、初始Executor數量等設定,呼叫start方法時會將ExecutorAllocationListener加入到LiveListenerBus中監聽Executor的新增、移除等;
9、ContextClearner
ContextClearner為RDD、shuffle、broadcast狀態的非同步清理器,清理超出應用範圍的RDD、ShuffleDependency、Broadcast物件;清理操作由ContextClearner啟動的守護執行緒執行;
10、SparkStatusTracker
低階別的狀態報告API,對job、stage的狀態進行監控;包含有一個jobProgressListener監聽器,用於獲取監控到的job、stage事件資訊、Executor資訊;
11、HadoopConfiguration
Spark預設使用HDFS來作為分散式檔案系統,HadoopConfigguration用於獲取Hadoop設定資訊,通過SparkHadoopUtil.get.newConfiguration建立Configuration物件,SparkHadoopUtil 會根據SPARK_YARN_MODE設定來判斷是用SparkHadoopUtil或是YarnSparkHadoopUtil,建立該物件時會將spark.hadoop.開頭設定都複製到HadoopConfugration中;
簡單總結
以上的物件為SparkContext使用到的主要物件,可以看到SparkContext包含了Spark程式用到的幾乎所有核心物件可見SparkContext的重要性;建立SparkContext時會新增一個勾點到ShutdownHookManager中用於在Spark程式關閉時對上述物件進行清理,在建立RDD等操作也會判斷SparkContext是否已stop;
通常情況下一個Driver只會有一個SparkContext範例,但可通過spark.driver.allowMultipleContexts設定來允許driver中存在多個SparkContext範例;
參考資料:
http://spark.apache.org/docs/latest/
更多Spark相關教學見以下內容:
CentOS 7.0下安裝並設定Spark http://www.linuxidc.com/Linux/2015-08/122284.htm
Spark1.0.0部署指南 http://www.linuxidc.com/Linux/2014-07/104304.htm
Spark官方文件 - 中文翻譯 http://www.linuxidc.com/Linux/2016-04/130621.htm
CentOS 6.2(64位元)下安裝Spark0.8.0詳細記錄 http://www.linuxidc.com/Linux/2014-06/102583.htm
Spark簡介及其在Ubuntu下的安裝使用 http://www.linuxidc.com/Linux/2013-08/88606.htm
安裝Spark叢集(在CentOS上) http://www.linuxidc.com/Linux/2013-08/88599.htm
Hadoop vs Spark效能對比 http://www.linuxidc.com/Linux/2013-08/88597.htm
Spark安裝與學習 http://www.linuxidc.com/Linux/2013-08/88596.htm
Spark 平行計算模型 http://www.linuxidc.com/Linux/2012-12/76490.htm
Ubuntu 14.04 LTS 安裝 Spark 1.6.0 (偽分散式) http://www.linuxidc.com/Linux/2016-03/129068.htm
相關文章