spark 执行流程及各组件执行

时间:2022-12-19 20:28:03

 

 

Spark初始化:

1.Spark的启动流程

 sbin/start-all.sh -> sbin/start-master.sh -> sbin/start-slaves.sh(ssh)

 MasterWorker主类启动,这两个主类都包含main方法

2.启动Master都完成了哪些工作呢?

 1.解析参数

 2.创建ActorSystem,然后通过ActorSystem创建ActorMaster extends Actor

 3.调用MasterpreStart(),启动了一个定时器,定期检查超时的Worker

 

3.启动Worker都完成了哪些工作呢?

 1.解析参数

 2.创建ActorSystem,然后通过ActorSystem创建ActorWorker extends Actor

 3.调用WorkerpreStart(),通过Master的连接URL,跟Master建立连接,发送注册消息

 Master接收Worker的注册请求,然后将注册消息保存起来,向Worker发送一个注册成功的消息

 WorkerWorker接收的这个消息后,启动一个定时器,定期向Master发送心跳

 Master接收到Worker发送来的心跳信息后,更新Worker的上一次心跳时间

 

----------------------------------------------------------------------------

4.内部构建实例

 先创建一个SparkContext实例,在SparkContext的主构造器中完成了的重要步骤

  1.创建一个SparkEnv

   1.1创建ActorSystemAkkaUtils创建的)

   1.2创建ShuffleManager

   1.3创建BlockManager

  2.先创建的TaskScheduler

   2.1跟据Master的连接URL--master spark://node-1.xiaoniu.com:7077

   TaskSchedulerImpl,又创建了一个SparkDeploySchedulerBackend

  3.创建DAGScheduler

  4.启动TaskScheduler

   TaskSchedulerImpl.start()方法,在该方法中,SchedulerBackendStart方法,

   在调用父类的start方法中,创建一个DriverActor(负责跟Executors通信的)

   SparkDeploySchedulerBackend准备了一堆参数(任务需要的资源,一下java参数,Executor的实现类)将这些参数封装到ApplicationDescription,然后创建ClientActor(跟Master通信的)

  5.ClientActorpreStart方法中,跟Master建立连接,向Master提交任务(将任务的描述信息通过case class发送给Master

  6.Master接收到ClientActor的任务描述后,将任务描述信息保存起来,然后给ClientActor返回一下消息,告诉ClientActor任务注册成功。接下来,Master调用了schedule方法,进行资源调度。有两种调度方式

  (一种的打散,一种是尽量集中)

  7.MasterWorker通信,然后让Worker启动Executor(将Excutor需要的资源,任务描述信息,还有一堆参数发送给了Worker

  8.WorkerMaster发送来的信息,启动ExecutorExecutor的实现类是ClientActor准备的,先发给MasterMaster再发给Worker

  9.Executor中有一个Main方法,先创建ActorSystem,然后创建Actor,在ActorpreStart方法中跟DriverActor进行通信。

Spark各组件执行时机:

1.SparkContext哪一端生成的?

    Drvier 

2.DAG是在哪一端被构建的?

    Driver

3.RDD是在哪一端生成的? RDD的分区是在哪一端:

Driver

4.广播变量是在哪一端调用的方法进行广播的?

 Driver

5.要广播的数据应该在哪一端先创建好再广播呢?

Driver

6.调用RDD的算子(TransformationAction)是在哪一端调用的

Driver

7.RDD在调用TransformationAction时需要传入一下函数,函数是在哪一端声明和传入的?

Driver

8.RDD在调用TransformationAction时需要传入函数,请问传入的函数是在哪一端执行了函数的业务逻辑?

Executor端,Executor中的Task执行的函数的业务逻辑,Executor是一个Java进程,并且Executor中有一个线程池,Task有一个包装类一个实现了Runnable接口的实例,将Task的包装类丢到线程池中,Task包装类的run方法会被调用,然后执行Task中的业务逻辑

9.自定义的分区器这个类是在哪一端实例化的?

Driver

10.分区器中的getParitition方法在哪一端调用的呢?

Executor中的Task中被执行 

11.Task是在哪一端生成的呢?

Driver端生成的Task,然后Task序列化,通过网络发送给ExecutorExecutor接收后,将Task反序列化,,然后用一个实现了Runnable接口的实现类包装,在丢进线程池执行

12.DAG是在哪一端构建好的并被切分成一到多个State

Driver

13.DAG是哪个类完成的切分Stage的功能?

DAGScheduler

14.DAGScheduler将切分好的Stage以什么样的形式给TaskScheduler

TaskSet,里面装了多个Task,在一个Stage中,Task是业务逻辑相同,但是处理的数据不相同的实例