Spark组件之SparkContext原理源码剖析(乾坤大挪移第二层)

今天谈一下Spark比较重要的组件。

文章有不足之处,多多指正。

SparkContext

三个重点:

  1. TaskScheduler,如何注册application,executor如何反向注册 (重中之重)
  2. DAGScheduler的通信
  3. SparkUI显示的是什么,用的是什么服务器

上流程图:

TaskScheduler的创建流程如下:

在这里插入图片描述流程总结:

  1. 启动CreateTaskScheduler()方法
  2. 执行TaskSchedulerImpl的构造方法
  3. 在构造去调用SparkDeploySchedulerBackend(它会在底层接收TaskSchedulerImpl的控制,实际上负责与Master的注册、Excutor的反向注册,task发送到Excutor的操作)。同时,它会调用TaskSchedulerImpl的init()方法去做创建Scheduler池(调度池)的操作。
  4. 创建SchedulePool,针对调用的不同任务,调度池保证每个调度有不同的优先策略,比如FIFO。 至此,TaskSchedulerImpl的构造完成。
  5. 构造完,TaskScheduler会执行TaskSchedulerImpl的start()方法
  6. Start()里面再调用SparkDeploySchedulerBackend的start()方法
  7. SparkDeploySchedulerBackend的start()方法里面会创建AppClient
  8. Appclient会创建一个ClientActor,它是一个实现类。(这里面涉及到scala的Actor,它是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁、资源争夺等情况。在具体实现的过程中,Scala中的Actor会不断的循环自己的邮箱,并通过receive偏函数进行消息的模式匹配并进行相应的处理。 )
  9. ClientActor会调用两个方法,顺序如下:registerWithMaster()>>>>tryRegisterAllMasters()
  10. 调用RegisterApplication。(它是一个case class,里面封装了application的信息,为注册master做准备)
  11. 这时Spark集群的Master就接收到过来的case class类的信息。依次基于master调度算法,分配master,找到对应的worker,启动Executor。(同时,Executor会反向注册自己到对应的组件。这里由于提交模式的不一样,具体也不一样。本地是driver。Yarn是ResourceManage。不过注册都是注册到SparkContext的SparkDeploySchedulerBackend里面)
  12. Excutor反向注册到SparkDeploySchedulerBackend类

DAGScheduler的创建流程如下:

在这里插入图片描述

SparkUI的创建流程如下:

在这里插入图片描述

发布了31 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/laughing1997/article/details/88991741