Spark组件之SparkContext原理源码剖析(乾坤大挪移第二层)
今天谈一下Spark比较重要的组件。
文章有不足之处,多多指正。
SparkContext
三个重点:
- TaskScheduler,如何注册application,executor如何反向注册 (重中之重)
- DAGScheduler的通信
- SparkUI显示的是什么,用的是什么服务器
上流程图:
TaskScheduler的创建流程如下:
流程总结:
- 启动CreateTaskScheduler()方法
- 执行TaskSchedulerImpl的构造方法
- 在构造去调用SparkDeploySchedulerBackend(它会在底层接收TaskSchedulerImpl的控制,实际上负责与Master的注册、Excutor的反向注册,task发送到Excutor的操作)。同时,它会调用TaskSchedulerImpl的init()方法去做创建Scheduler池(调度池)的操作。
- 创建SchedulePool,针对调用的不同任务,调度池保证每个调度有不同的优先策略,比如FIFO。 至此,TaskSchedulerImpl的构造完成。
- 构造完,TaskScheduler会执行TaskSchedulerImpl的start()方法
- Start()里面再调用SparkDeploySchedulerBackend的start()方法
- SparkDeploySchedulerBackend的start()方法里面会创建AppClient
- Appclient会创建一个ClientActor,它是一个实现类。(这里面涉及到scala的Actor,它是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁、资源争夺等情况。在具体实现的过程中,Scala中的Actor会不断的循环自己的邮箱,并通过receive偏函数进行消息的模式匹配并进行相应的处理。 )
- ClientActor会调用两个方法,顺序如下:registerWithMaster()>>>>tryRegisterAllMasters()
- 调用RegisterApplication。(它是一个case class,里面封装了application的信息,为注册master做准备)
- 这时Spark集群的Master就接收到过来的case class类的信息。依次基于master调度算法,分配master,找到对应的worker,启动Executor。(同时,Executor会反向注册自己到对应的组件。这里由于提交模式的不一样,具体也不一样。本地是driver。Yarn是ResourceManage。不过注册都是注册到SparkContext的SparkDeploySchedulerBackend里面)
- Excutor反向注册到SparkDeploySchedulerBackend类