spark作业调度

spark调度分为两种,一是应用之间的,二是应用内部作业的。本文主要介绍spark应用内部的作业调度,多线程提交作业的情况下,各个job的调度方式。详细介绍了FIFO与Fair调度算法的原理、源码与案例。结合thriftserver介绍了SQL级别的作业调度
摘要由CSDN通过智能技术生成

一、调度分类

调度分为两种,一是应用之间的,二是应用内部作业的。

(一)应用之间

我们前面几章有说过,一个spark-submit提交的是一个应用,不同的应用之间是有调度的,这个就由资源分配者来调度。如果我们使用Yarn,那么就由Yarn来调度。调度方式的配置就在$HADOOP_HOME/etc/hadoop/yarn-site.xml

<property>
<name>yarn.resourcemanager.scheduler.class</name> 
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

 

(二)应用内部

参考《Spark基础入门(三)--------作业执行方式》可以看到,SparkContext底层会触发调用runJob的方法阻塞式的提交job,提交job的线程会处于阻塞状态,同一个线程中,后面的job需要等待前面job完成才能提交。但当多线程执行时,则可以并发提交Job

例如SparkStreaming运行并发提交时,可以看到一个SparkStreaming的项目中多个job在同时跑:

 

再例如Thriftserver,多个用户通过beeline连接Thriftserver提交自己的查询,所有的查询都是并行运行的:

 

我们重点介绍应用内部的调度,调度方式的配置在

$SPAKR_HOME/conf/spark-defaults.conf

spark.scheduler.mode = FIFO/FAIR


二、调度原理

结合《Spark基础入门(三)--------作业执行方式

(一)作业提交与调度池的创建


1. DAGScheduler采取的生产者消费者模型,存在一个Event队列,用户和TaskScheduler会生产event到这个队列中,DAGScheduler中会有一个Daemon线程去消费这些event并产生对应的处理。DAGScheduler可以处理的Event包括:JobSubmittedCompletionEventExecutorLostTaskFailedStopDAGScheduler

2. DAGScheduler 在接收到JobSubmittedEvent之后,会首先计算出其DAG图,然后划分Stage,最后提交TaskSetTaskScheduler(通过调用TaskSchedulersubmitTasksTaskScheduler还有cancelTasks的方法)

3. TaskSchedulersubmitTasks方法最后会创建TaskManager的实例,由它去管理里面的TaskSet

4. SparkContext是多线程安全的,可以有多个线程提交Job,这个Job也就是sparkAction

5. 每个线程提交Job时,是按Stage为最小单位来提交的,提交一个stageTaskSet(一堆task任务)有一个TaskSetManager会来管理TaskSet一个TaskSet对应一个

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值