大数据学习十八:Spark调度流程

1、SparkContext涉及的类:Utils(用于序列化和反序列化)、Logging(Spark自己用log4j封装Object(相当于java中的private final static Logger)),SparkConf(用于获取spark的环境信息放在ConcurrentMap中,且在运行时sparkenv不可以改变)【./bin/spark-submit会主动创建SparkContext】

2、SparkContext 中CallSite(栈顶函数字符串,20个函数栈的以\n分割的字符串)【暂时没发现记录这个有啥作用】,

 persistRdd是个map[rddID,RDD],excutorEnv 是个HashMap(pass to excutors),sparkContext中的sparkconf是新new 了一个(深复制),sparkcontext初始化了driver信息(IP:PORT)

sparkcontext新new一个LiveListenerBus,用于异步传递SparkListenerEvents到已经注册的SparkListeners,在总线中注册一个metrics的计数器用于计数应用产生还未被使用并被发送到总线上的事件

3、为应用创建内存区AppStatusStore.createLiveStore(),SparkUI使用的是嵌入式Web服务器Jetty,初始化sparkUI,读取excutor内存大小,在创建createTaskSchedule前需要注册HeatBeatReceiver(构造Excutor时需要),Spark新建TaskScheduler (TaskSchedulerImpl),集群模式通过SchedulerBakend(多线程调用需加锁),本地模式通过LocalSchedulerBackend,客户端首先调用initialize()和start(),然后通过runRasks()提交task sets。

4、创建调度的守护线程ThreadUtils.newDeamonSingleThreadScheduleExcutor(),默认的调度方式为FIFO(可选项为公平调度)【local模式的Excutor由LocalSchedulerBackend创建】,然后进入LocalScheduleBackend(LocalEndPoint序列化该类,通过RpcEndPoint异步调用LocalScheduleBackend,应该预防LocalScheduleBackend和TaskSchedulerImpl之间的死锁)。

5、LocalScheduleBackend连接connect到本地(new Socket()),TaskScheduleImpl.initial(),新建FIFOSchedulableBuilder,至此,scheduler创建和启动结束。

6、启动tastSchedule.start(),

你可能感兴趣的:(大数据学习十八:Spark调度流程)