Spark笔记——基础底层、sparkcluster任务提交流程

 一、driver、executor

1、SparkContext是在哪一端生成的?
  Driver
2、RDD是在哪一端生成的?
 Driver
3、调用RDD的算子(Transformation和Action)是在哪一端调用的?
 Driver
4、RDD在调用Transformation和Action时需要传入一个函数,函数是在哪一端声明和传入的?
 Driver
5、RDD在调用Transformation和Action时需要传入函数,请问传入的函数是在哪一端执行了函数的业务逻辑?
Executor
6、自定义的分区器这个类是在哪一端实例化的?
 Driver
7、分区器中的getParitition(获取分区号)方法在哪一端调用的呢?
 Driver
8、DAG是在哪一端被构建的?
 Driver
9、DAG是在哪一端构建好的并被划分为一到多个Stage的?
 Driver
10、DAG是哪个类完成的切分Stage的功能?
	DAGScheduler
11、DAGScheduler将切分好的Stage以什么样的形式给TaskScheduler?
Taskset
12、Task是在哪一端生成的呢? 
 Driver
13、广播变量是在哪一端调用的方法进行广播的?
 Driver
14、要广播的数据应该在哪一端先创建好再广播呢? 
 Driver
15、Accumulator累加器是在哪一端进行累加的?
Executor
16、Accumulator累加后的最终的值是在哪一端?
 Driver

二、yarnCluster下,spark任务提交流程

2.1简单版本

(1)driver通过spark-submit启动SparkSubmit进程,开始创建重要的对象SparkContext,并向Master请求(携带任务描述)

(2)Master接收到任务描述之后,开始生成真正的任务信息,并将其放入任务队列

(3)Master将所有有效的Worker过滤,按照空闲资源的多少进行降序排序,然后通过有效的Worker启动Executor

(4)Worker拿到任务信息,并启动Executor

(5)Executor向Driver反向注册

(6)Driver将生成的task发送给相应的Executor,Executor执行任务

2.2详细版本

  1. 提交任务,执行spark-submit。调用SparkSubmit类,内部执行submit-->doRunMain-->通过反射获取应用程序的主类对象-->执行主类的main方法

  2. 构建SparkConf和SparkContext对象,在SparkContext入口类做3件事,  

    1.创建rpcEnv对象(创建了ActorSystem对象)

    2.TaskScheduler(用来生成并发送task给Executor)

    3.DAGScheduler(用来划分Stage)

  3.  

    clientEndPoint(负责和Master通信,向Master注册任务信息)将任务信息封装到ApplicationDescription对象里并提交给Master

     

    4.Master收到clientEndpoint提交的任务信息后把任务信息存到内存中,然后将任务信息又放到队列中(waitingApps)

    5.当开始执行这个任务信息时,调用scheduler方法,进行资源调度

    6.将调度好的资源封装到LaunchExecutor并发送给对应的Worker

    7.Worker接收到Master发送过来的调度信息(LaunchExecutor)后,将信息封装成一个ExecutorRunner对象

    8.封装成ExecutorRunner对象后,调用ExecutorRunner的start方法,开始启动CoarseGrainedExecutorBackend对象

    9.Executor启动后向driverEndpoint(负责和Executor通信,接受Executor反向注册和把任务发送到Executor)进行反向注册

    10.与driverEndpoint注册成功后,创建一个线程池(ThreadPool),用来执行任务

    11.当所有的Executor注册完成后,意味着作业环境准备好了,Driver端会结束与SparkContext对象的引用 12. 对Driver初始化完成后(创建了一个sc的实例),会继续执行我们自己提交的App代码,当触发了ACtion算子的时候,就触发一个job,这是就会调用DAGScheduler对象开始进行Stage的划分

    13.DAGScheduler开始划分Stage

    14.将划分好的Stage按照分区生成一个一个的task,并且封装对TaskSet对象,然后TaskSet提交到TaskScheduler

    15.TaskScheduler接收到提交过来TaskSet,拿到一个序列化器,对TaskSet序列化,将序列化好的TaskSet封装到LaunchExecutor并提交到driverEndpoint

    16.把LaunchExecutor发送到Executor上

    17.Executor接收到driverEndpoint发送过来的任务(LaunchExecutor),会将其封装成TaskRunner,然后从线程池中获取线程来执行TaskRunner

    18.TaskRunner拿到反序列化器,反序列化TaskSet,然后执行App代码。也就是对RDD分区上执行的算子和自定义函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值