Spark初始化:

1.Spark的启动流程

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

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

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

解析参数

创建ActorSystem,然后通过ActorSystem创建Actor(Master extends Actor)

调用Master的preStart(),启动了一个定时器,定期检查超时的Worker

 

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

解析参数

创建ActorSystem,然后通过ActorSystem创建Actor(Worker extends Actor)

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

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

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

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

 

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

4.内部构建实例

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

创建一个SparkEnv

创建ActorSystem(AkkaUtils创建的)

创建ShuffleManager

创建BlockManager

先创建的TaskScheduler

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

又创建了一个SparkDeploySchedulerBackend

创建DAGScheduler

启动TaskScheduler

在TaskSchedulerImpl.start()方法,在该方法中,SchedulerBackend的Start方法,

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

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

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

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

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

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

跟Master发送来的信息,启动Executor(Executor的实现类是ClientActor准备的,先发给Master,Master再发给Worker)

中有一个Main方法,先创建ActorSystem,然后创建Actor,在Actor的preStart方法中跟DriverActor进行通信。

Spark各组件执行时机:

1.SparkContext哪一端生成的?

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

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

Driver端

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

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

Driver端

6.调用RDD的算子(Transformation和Action)是在哪一端调用的

Driver端

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

Driver端

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

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

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

Driver端

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

Executor中的Task中被执行

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

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

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

Driver端

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

DAGScheduler

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

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