一、概述

  • standalone-client模式启动: 

阿里spark任务资源配比 spark提交任务指定资源队列_任务调度

 

二、执行流程: (x)指的是上图的第x步

1、启动集群

  1. Worker向Master汇报资源(1)。
  2. Master掌握集群资源(2)。

2、启动application的时候创建Driver对象。

3、new SparkContext()(3):

  1. 创建DAGcheduler、TaskScheduler对象。TaskScheduler中创建了ClietActor来和Master通信,创建了DriverActor备用等待Worker中的Executer的注册。
  2. TaskScheduler向Master申请资源(4)。
  3. Master收到请求之后筛选满足资源的节点,在Worder上启动Executor(5)。
  4. 筛选满足资源的过程:1)、根据--executor-memory参数筛选出剩余可用内存大于等于该内存的机器,2)、根据--executor-cores参数按类型分配:分散策略(剩余核数倒叙,然后从大到小依次一个一个的分配)、集中策略(剩余核数优先集中往一台机器分配,直到核不够再往另外一台机器分配)
  5. Executor启动之后反向注册给TaskScheduler,Driver掌握了一批计算资源(6)。

4、rdd4.forreach(7):

  1. DAGScheduler拿到每个job中的RDD依赖关系形成DAG有向无环图(8)。
  2. 依照RDD的宽窄依赖切割job划分成stage(8)。
  3. 将stage封装成TaskSet对象提交给TaskScheduler(8)。
  4. TaskScheduler会遍历TaskSet拿到一个个的task(9),发送到Executor中的TheadPool线程池中去执行(10),并监控task执行回收结果(11)。 

 三、流程归类:

  • 资源调度:一、二、三
  • 任务调度:四
  • 如果下面还有action,再次执行任务调度流程。

四、Spark的粗粒度资源申请

  • 当application执行之前,会将所有的资源申请完毕,申请到资源就执行application,申请不到一直等待,当所有的task执行完毕才会释放这批资源。
  • 优点:application执行之前将资源申请完毕,每个task执行时就不需要自己去申请资源,执行更快->job也就快了->application执行就快。
  • 缺点:所有的task执行完毕才会释放这批资源,容易是集群资源不能充分利用。

五、MR细粒度资源申请

  • 当application执行时,有执行任务的task去自己申请资源,使用完毕之后自己释放资源。
  • 优点:集群资源充分利用。
  • 缺点:task自己申请资源、释放资源。所以执行慢->application执行慢。