首頁 > 軟體

Spark原始碼分析之SparkContext概述

2020-06-16 17:35:07

本篇文章就要根據原始碼分析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


IT145.com E-mail:sddin#qq.com