SparkContext

SparkContext
1,Spark程序在運行的時候分爲Driver和Executors兩部分;
2,Spark的程序編寫是基於SparkContext的,具體來說包含兩方面:
Spark編程的核心基礎—RDD,是由SparkContext來最初創建(第一個RDD一定是由SparkContext來創建的);
Spark程序的調度優化也是基於SparkContext;
3,Spark程序的註冊時通過SparkContext實例化時候生產的對象來完成的(其實是SchedulerBackend來註冊程序)
4,Spark程序運行的時候要通過Cluster Manager獲得具體的計算資源,計算資源的獲取也是通過SparkContext產生的對象來申請的(其實是SchedulerBackend來獲取計算資源的);
5,SparkContext崩潰或者結束的時候整個Spark程序也結束啦!

總結:
Spark程序是通過SparkContext發佈到Spark集羣的;
Spark程序的運行都是在SparkContext爲核心的調度器的指揮下進行的;
SparkContext崩潰或者結束的時候整個Spark程序也結束啦!

三:SparkContext天堂內幕
1,SparkContext構建的頂級三大核心對象:DAGScheduler、TaskScheduler、ShedulerBackend,其中:
DAGScheduler是面向Job的Stage的高層調度器;
TaskScheduler是一個接口,根據具體的Cluster Manager的不同會有不同的實現,Standalone模式下具體的實現是TaskSchedulerImpl;
SchedulerBackend是一個接口,根據具體的Cluster Manager的不同會有不同的實現,Standalone模式下具體的實現是SparkDeploySchedulerBackend;
2,從整個程序運行的角度來講,SparkContext包含四大核心對象:DAGScheduler、TaskScheduler、ShedulerBackend、MapOutputTrackerMaster。

源碼:
//Create and start the scheduler
val(sched, ts) = SparkContext.createTaskScheduler(this, master)
_schedulerBackend= sched
_taskScheduler= ts
_dagScheduler= new DAGScheduler(this)
_heartbeatReceiver.askBoolean

// start TaskScheduler after taskScheduler sets DAGScheduler reference in DAGScheduler’s
// constructor
_taskScheduler.start()

createTaskScheduler:
caseSPARK_REGEX(sparkUrl) =>
valscheduler = new TaskSchedulerImpl(sc)
valmasterUrls = sparkUrl.split(“,”).map(“spark://” + _)
valbackend = new SparkDeploySchedulerBackend(scheduler, sc, masterUrls)
scheduler.initialize(backend)
(backend, scheduler)

在sheduler.initialize調用的時候會創建ShedulerPool
this.backend= backend
// temporarily set rootPool name to empty
rootPool= new Pool(“”, schedulingMode, 0, 0)
schedulableBuilder= {
schedulingModematch {
case SchedulingMode.FIFO=>
new FIFOSchedulableBuilder(rootPool)
case SchedulingMode.FAIR=>
new FairSchedulableBuilder(rootPool, conf)
}
}
schedulableBuilder.buildPools()

SparkDeploySchedulerBackend有三大核心功能:
負責與Master鏈接註冊當前程序;
接收集羣中爲當前應用程序而分配的計算資源Executor的註冊並管理Executors;
負責發送Task到具體的Executor執行
補充說明的是:SparkDeploySchedulerBackend是被TaskSchedulerImpl來管理的!

// start TaskScheduler after taskScheduler sets DAGScheduler reference in DAGScheduler’s
// constructor
_taskScheduler.start()

valcommand = Command(“org.apache.spark.executor.CoarseGrainedExecutorBackend”,
args, sc.executorEnvs, classPathEntries ++ testingClassPath, libraryPathEntries, javaOpts)

當通過SparkDeploySchedulerBackend註冊程序給Master的時候會把上述command提交給Master,Master發指令給Worker去啓動Executor所在的進程的時候加載的main方法所在的入口類就是command中的CoarseGrainedExecutorBackend,當然你可以實現自己的ExecutorBackened,在CoarseGrained
ExecutorBackend中啓動Executor(Executor是先註冊再實例化),Executor通過線程池併發執行Task.

private[spark] case class ApplicationDescription(
name: String,
maxCores: Option[Int],
memoryPerExecutorMB: Int,
command: Command,
appUiUrl: String,
eventLogDir: Option[URI] = None,
// short name of compression codec used when writing event logs, if any (e.g. lzf)
eventLogCodec: Option[String] = None,
coresPerExecutor: Option[Int] = None,
user: String = System.getProperty(“user.name”, “”)) {

override deftoString: String = “ApplicationDescription(” + name + “)”

這裏寫圖片描述

學習於:

DT大數據夢工廠
新浪微博:www.weibo.com/ilovepains/
微信公衆號:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:[email protected]

發佈了36 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章