美文网首页
Spark源码分析小结

Spark源码分析小结

作者: 小狼星I | 来源:发表于2018-10-18 17:39 被阅读0次

    Spark源码分析小结

    通过前面对Master,worker,executor,sparkContext,DAGScheduler,TaskScheduler的讲解,我们现在做几点总结:

    1. 在sparkContext实例化的时候通过createTaskScheduler来创建TaskSchedulerImpl和SparkDeploySchedulerBackend,在TaskScheduler的initialize方法中把SparkDeploySchedulerBackend传进来从而给TaskSchedulerImpl的backend赋值;在TaskScheduler调用start方法的时候会调用backend.start方法,在start方法中会注册当前应用程序;
    2. DAGScheler在提交TaskSet给底层调度器的时候是面向接口TaskScheduler,这符合面向对象中依赖抽象而不依赖实体的原则,带来底层资源调度器的可插拔性,导致spark可运行众多的资源调度器模式上,如:Standalone,Yarn,Mesos,Local,EC2等,其他自定的资源调度器;
    3. TaskScheduler的核心任务是提交TaskSet到集群运算并汇报结果;TaskScheduler内部握有SchedulerBackend,从Standalone的模式来讲具体实现是SparkDeploySchedulerBackend;
    4. SparkDeploySchedulerBackend在启动的时候构造了APPClient实例,而appclient实例start的时候启动了ClientEndPoint这个消息循环体,ClientEndPoint在启动的时候会向Master注册当前程序,而SparkDeploySchedulerBackend的父类CoarseGrainedshedulerBackend在启动的时候会实例化类型为DriverEndPoint(这就是我们程序运行时的Driver)的消息循环体;SparkDeploySchedulerBackend 专门负责收集Worker上的资源信息,当ExecutorBackend启动的时候会发送RegisterExecutor向DriverEndPoint注册,这样SparkDeploySchedulerBackend就掌握了当前应用程序的计算资源,TaskScheduler就是通过SparkDeploySchedulerBackend拥有的计算资源来具体运行Task的;
    5. SparkContext,DAGScheduler,TaskSchedulerImpl,SparkDeploySchedulerBackend在应用程序启动的时候只实例化一次,应用程序存在期间始终存在这些对象;

    我们结合图例再将整个过程捋一遍,如下图所示:

    在SparkContext实例化的时候调用CreateTaskScheduler来创建TaskSchedulerImpl和SparkDeploySchedulerBackend,同时在SparkContext实例化的时候会调用TaskSchedulerImpl的start,在start方法中会调用SparkDeploySchedulerBackend的start方法,在start方法中会创建AppClient对象并调用AppClient对象的start方法,再AppClient.start方法中会创建ClientEndPoint,在创建ClientEndPoint会传入Command来制定具体为当前应用程序启动的Executor进行的入口类名CoarseGrainedExecutorBackend,然后ClientEndPoint启动并通过tryRegisterMaster来注册当前的应用程序到Master中,Master接受到注册信息后如果可以运行程序,则会为该应用程序创建jobId并通过schedule来分配计算资源,具体计算资源的分配是
    通过应用程序的运行,Memroy,cores等配置信息来决定的,最后master发送指令worker,worker中为当前应用程序分配计算资源时会首先分配ExecutorRunner,ExecutorRunner内部通过Thread的方式构建ProcessBuilder来启动另外一个JVM进程,这个JVM进程启动时加载main方法所在的类名称就是在创建ClientEndPoint时传入的Command来指定具体名称为
    CoarseGrainedExecutorBackend的类,此时JVM再通过ProcessBuilder启动的时候获取了CoarseGrainedExecutorBackend后,加载并调用其中的main方法,在main方法中实例化了CoarseGrainedExecutorBackend本身这个消息循环体,而CoarseGrainedExecutorBackend在实例化的时候会回调onStart方法向DriverEndPoint发送RegisterExecutor来注册当前的
    CoarseGrainedExecutorBackend,此时DriverEndPoint收到该注册信息后比保存在了SparkDeploySchedulerBackend实例的内存数据结构中,这样Driver就获取到了计算资源,同时并发送RegisteredExecutor给CoarseGrainedExecutorBackend;

    image.png

    相关文章

      网友评论

          本文标题:Spark源码分析小结

          本文链接:https://www.haomeiwen.com/subject/qouszftx.html