版權聲明:本文為原創文章,未經允許不得轉載。
SparkContext(簡稱sc)是Spark程序的主入口,代表一個連接到Spark集群(Standalone、YARN、Mesos三種集群部署模式)的連接,能被用來在集群上創建RDDs、計數器(accumulators)和廣播(broadcast)變量等。一旦和集群連接,sc首先得到集群中節點的executor信息,然后把app代碼(jar形式或python文件)發送給executors,最后把job細分后的tasks派發給具體的executor執行。
1.屬性
(1)Spark異步事件監聽器總線,可以理解為監聽器的管家
<code>
private[spark] val listenerBus = new LiveListenerBus
</code>
(2)兩個map集合,用于存儲為每個靜態文件和jar存放對應的URL和本地時間戳
<code>
private[spark] val addedFiles = HashMap[String, Long]
private[spark] val addedJars = HashMap[String, Long]
</code>
(3)用一個弱引用類型的Map,記錄所有的持久化的RDDs,若值被gc后,那么引用將為null,每當插入N個元素后,就會從Map移除引用為空的entry
<code>
private[spark] val persistentRdds = new TimeStampedWeakValueHashMap[Int, RDD[_]]
</code>
(4)根據sparkconf、isLocal、監聽總線創建Spark運行環境
<code>
private var _env: SparkEnv = createSparkEnv(_conf, isLocal, listenerBus)
</code>
(5)構造SparkContext的元數據清理器,使用了Timer周期性地清理日志信息,元數據類型不同,清理周期也可能不同
<code>
private var _metadataCleaner: MetadataCleaner = new MetadataCleaner(MetadataCleanerType.SPARK_CONTEXT, this.cleanup, _conf)
</code>
(6)默認executor的執行內存為1024M
<code>
private var _executorMemory: Int = _conf.getOption("spark.executor.memory")
.orElse(Option(System.getenv("SPARK_EXECUTOR_MEMORY")))
.orElse(Option(System.getenv("SPARK_MEM"))
.map(warnSparkMem))
.map(Utils.memoryStringToMb)
.getOrElse(1024)
</code>
(7)一個Spark application唯一的主鍵,它的形式取決于調度的實現,例如本地模式為'local-1433865536131'、YARN模式為 'application_1433865536131_34483'
<code>
private var _applicationId: String = _
</code>
(8)DAG調度器,把job根據shuffle邊界劃分為TaskSets
<code>
@volatile private var _dagScheduler: DAGScheduler = _
</code>
(9)Task調度器,目前只有一個實現子類TaskSchedulerImpl,負責接受從DAG調度器生成的TaskSets然后把他們分配到executor中執行,而TaskSetManager負責TaskSet的調度
<code>
private var _taskScheduler: TaskScheduler = _
</code>
(10)一個后端的調度接口,用于不同集群模式的調度
<code>
private var _schedulerBackend: SchedulerBackend = _
</code>
(11)設置一個心跳接收器,driver接受executor的心跳
<code>
private var _heartbeatReceiver: RpcEndpointRef = _
</code>
(12)JobProgressListener 用于處理Job及Stage相關的事件監聽器
<code>
private var _jobProgressListener: JobProgressListener = _
</code>
2.方法
構造方法有8個,比較簡單就不介紹了。
2.1.創建RDD的方法如下所示:
方法對應生成的RDD類型有:BinaryFileRDD、BlockRDD、CartesianRDD、CheckpointRDD、CoalescedRDD、CoGroupedRDD、EmptyRDD、HadoopRDD、LocalCheckpointRDD、MapPartitionsRDD、MapPartitionsWithPrepationRDD、NewHadoopRDD、ParallelCollectionRDD、ParititionerAwareUnionRDD、PartitionPruningRDD、PartitionwiseSampledRDD、PipeRDD、SampleRDD、ShuffleRDD、SubstractedRDD、UnionRDD、ZippedPartitionsRDD、ZippedWithIndexRDD,如此多的的RDD,可見RDD的重要性。
2.2.創建計數器(accumulators)的方法如下所示:
2.3.創建廣播(broadcast)變量的方法就一個:
<code>
def broadcast[T: ClassTag](value: T): Broadcast[T] = {
</code>
2.4.Spark程序程序job的運行是通過actions算子觸發的,action算子如下所示:
每一個action算子其實是一個runJob方法的運行,job的運行是將JobSubmitted事件添加到DAGScheduler中的事件執行隊列中,并用JobWaiter等待結果的返回。runJob方法如下所示:
5.SparkContext如何在三種部署模式Standalone、YARN、Mesos下實現任務的調度
SparkContext中有一句關鍵性的代碼:
//根據master(masterURL)及SparkContext對象創建TaskScheduler,返回SchedulerBackend及TaskScheduler
<code>
val (sched, ts) = SparkContext.createTaskScheduler(this, master)
</code>
考慮到篇幅的長度,方法createTaskScheduler的實現下一篇再介紹。