Spark 的运行过程(本人的一些总结)

  最近在复习Spark,有了一些自己的总结,在这里码上留作自己以后回忆所用


(ps:本文不涉及基本概念的解答,只提供一个大致的思路)

    代码的编写,缺少不了的就是main函数,而一个使用Spark的代码是怎么写的呢,首先是main函数,在main函数里会先创建一个Sparkcontext,数据的形式是RDD,内部函数是Spark中的transformation和action这两大类的多功能api,其中Spark在进行transformation计算的时候,不会触发Job ,在执行action操作的时候,才会触发Job,接下来开始分析他的执行过程。

    当我们把这份代码跑起来,我们就可以把这个正在运行的程序当成一个Driver,这个时候我们可以参考一下Yarn分配资源时候的过程,yarn中当被提交一个应用程序的时候,资源管理器会分配一分资源来启动ApplicationMaster,然后再由这个AM来请求其他用于执行任务的资源,这里我们也可以理解这个Driver就是被第一个分配的特殊excutor,他也是在一个worker上进行,而他的任务是什么呢?我们来看他的内部是什么,他的内部有DAGSchedule、TaskSchedule、SchedulerBackend,HeartbeatReceiver这里就会产生新的疑问,这几个东西分别是用来干什么的呢?

    DAGSchedule

    首先解释一下第一个DAGSchedule,DAG--有向无环图,这里的DAG当然就是指的,每个RDD作为一个节点和他们之间的边组成的有向无环图,而DAGSchedule顾名思义就是用来处理这些DAG的。他会把DAG划分为不同的stage,如何划分呢?这里就提及到了RDD之间的依赖关系,宽依赖和窄依赖,当父RDD只进入一个子RDD,他们之间就是窄依赖,反之则是宽依赖。划分原则呢就是遇见窄依赖就放进当前stage,遇到宽依赖则断开。每一个stage里面都会划分一个taskset,也就是数据集,而DAGSchedule的下一个任务呢,就是将这个TaskSet传给TaskSchedule。

    TaskSchedule

    TaskSchedule的任务呢也很清晰,从他的名字就可以知道,他就是用来调度任务的。换言之他会分配Task到哪一个executor上去执行。而这些executor又是怎么来的呢,Driver会向资源管理器来申请资源,资源管理器就会给他分配资源,而这些资源就包括他在满足需求的worker node上面创建executor。

    SchedulerBackend

    上一步说到的TaskSchedule,他是如何与executor之间联系的呢,这里就说到SchedulerBackend,他就相当于TaskSchedule的一个外交接口,他从TaskSchedule上拿到task然后分发到executor上,而executor上也会有对应的excutorBackend用来与之交接,这里又有一个过程,就是当executor被创建之后,他就会反过来通过上述节点进行注册。

    HeartbeatReceiver

   最后的HeartbeatReceiver则是用来负责接收Executor的心跳信息,监控Executor的存活状况,并通知到TaskScheduler。


     说到这里是不是已经对整个过程有了较为清晰的了解了呢,接下来我们整个梳理一下,当程序开始执行后,就相当于启动了一个Driver,然后Driver会初始化一个Sparkcontext,并创建DAGSchedule、TaskSchedule、SchedulerBackend,HeartbeatReceiver,再往后当遇到了一个action操作之后,就会触发一个job。

     而这个job又要被划分成很多stage,如何划分呢?就是通过DAGSchedule根据RDD之间的依赖关系来进行划分,划分完事之后,DAGSchedule把taskset传给TaskSchedule,由其来负责任务调度,这时候Driver会根据需求向ResourceManager请求资源,ResourceManager则根据需求开始分配资源,开始在满足要求的worker node 上创建executor,executor通过executorBackend-SchedulerBackend-TaskSchedule进行注册,然后TaskSchedule通过SchedulerBackend进行分发task,当excutor上执行结束之后,又会通过executorBackend传递回去,让TaskSchedule知道,TaskScheduler接到消息后通知TaskManager,移除该Task任务,开始执行下一个任务。TaskScheduler同时会将信息同步到TaskSet Manager中一份,全部任务执行完毕后TaskSet Manager将结果反馈给DAGScheduler,如果属于ResultTask 会交给JobListener。否则话全部任务执行完毕后写入数据。

     欢迎指出博主的缺漏和错误~

猜你喜欢

转载自blog.csdn.net/qq_32038679/article/details/80382543