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是业务逻辑相同,但是处理的数据不相同的实例