天天看点

Yarn的调度器, Spark的任务调度, DAGSchedule, TaskSchedule, worder 131. 复习, Yarn三种调度器2. Spark任务调度

1. 复习, Yarn三种调度器

1.1 什么是调度器

主要是用于研究一个任务提交之后,下一个任务又来了改怎么执行. 绝对我们任务如何进行执行.

1.2 Yarn当中的调度器主要有三种

  • 第一种:队列调度器FIFO: 第一个任务提交,先执行.然后第二个任务提交,等着第一个任务执行完毕之后再执行第二个任务.

    第一个任务: 大任务, 需要运行4个小时

    第二个任务: 小任务, 需要运行3分钟.

    Yarn的调度器, Spark的任务调度, DAGSchedule, TaskSchedule, worder 131. 复习, Yarn三种调度器2. Spark任务调度

    这种调度器没人用了,不管是apache软件的版本,还是CDH软件的版本.

    hadoop1.x使用的是这种版本的调度器

  • 第二种调度器: capacity Scheduler容量调度器, apache的版本默认使用的调度器.
    • 优点: 将整个资源,换分为好多块.

      根据我们提交的任务需要资源的大小,将我们的任务,划分到不听的资源队列里面去,可以允许多个任务并行的快速的执行

    • 缺点: 将资源给划散了.
      Yarn的调度器, Spark的任务调度, DAGSchedule, TaskSchedule, worder 131. 复习, Yarn三种调度器2. Spark任务调度
  • 第三种调度器: Fair Scheduler公平调度器, CDH的软件默认使用的调度器.

    第一个任务提交: 将所有的资源全部分配给第一个任务,保证第一个任务最快的完成.

    第二个任务提交: 从第一个任务当中划分一部分资源出来, 给第二个任务进行执行.

    • 优点: 可以快速的执行我们的一些大任务
    • 缺点: 造成资源频繁的分配.
      Yarn的调度器, Spark的任务调度, DAGSchedule, TaskSchedule, worder 131. 复习, Yarn三种调度器2. Spark任务调度

2. Spark任务调度

Spark任务调度模式是FIFO

各个RDD之间存在着依赖关系,这些依赖关系就形成有向无环图DAG,DAGScheduler对这些依赖关系形成的DAG进行Stage划分,划分的规则很简单,从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分。完成了Stage的划分。DAGScheduler基于每个Stage生成TaskSet,并将TaskSet提交给TaskScheduler。TaskScheduler 负责具体的task调度,最后在Worker节点上启动task。

Yarn的调度器, Spark的任务调度, DAGSchedule, TaskSchedule, worder 131. 复习, Yarn三种调度器2. Spark任务调度
  • 首先,RDD Objects划分成DAG(有向无环图)

    各个RDD之间存在着依赖关系, 这些依赖关系就形成有向无环图DAG.

  • DAG Scheduler 职能如下
    • 划分DAG成多个stage, 每个stage会形成一个taskSet.
    • 记录缓存的RDD血统.
    • 提交taskSet到Task Scheduler(不同模式有不听的底层任务调度器)

      a. Spark-Cluster模式下是TaskScheduler

      b. Yarn-Cluster模式下是YarnClusterScheduler

      c. Yarn-Client模式下是YarnClientClusterScheduler

    • 重新提交丢失的stage到TaskScheduler
  • Task Scheduler(不知道stage是哪一部分RDD的数据)
    • 每个TaskSet(Stage)生成一个taskManager
    • 决定task任务执行的最佳位置
    • 推测执行,哪些任务执行慢,就停止这些任务重新到新节点上执行
    • 提交一组taskSet(tasks) + 参数
    • 将丢失的taskSet重新提交给DAG Scheduler ==> 队列FIFO的原则执行推过来的stage.
  • worker 是真正的执行任务的节点
    • 每个分区开启一个进程(executor)
    • 每个executor中, 开启一组线程, 执行一组taskSet, 每个task就是一个线程
    • 实时报告metrics给老大
    • 将计算结果返回给driver.

继续阅读