Spark基于资源调度和任务调度;粗粒度资源申请和细粒度资源申请(详细版:图解+文字说明)
Spark任务调度和资源调度
1).资源调度
a).集群启动,Worker向Master汇报资源,Master掌握了集群资源情况
b).当在客户端提交任务的时候,运行任务,new SparkContext,会创建两个对象:DAGScheduler和TaskScheduler
c).TaskScheduler向Master申请资源,用于启动executor
d).Master找到满足资源的节点启动Executor
e).Executor启动之后,反向注册给Driver,Driver掌握了集群计算资源
2).任务调度
a).当application运行到Action算子时,触发job,开始任务调度
b).每个job中有一系列RDD的依赖关系,形成一个DAG有向无环图。
c).DAG有向无环图被DAGScheduler按照RDD之间的宽窄依赖关系切割job划分stage
d).DAGScheduler将stage以taskSet的形式提交给TaskScheduler
e).TaskScheduler遍历set,拿到一个个task,发送到Executor中ThreadPool执行
f).TaskScheduler监控task回收结果
注意:
a).TaskScheduler发送task会失败,重试3次,如果依然失败,由DAGScheduler重试stage,重试4次,如果依然失败,stage所在的job就失败了,job失败,application就失败了。
b).TaskScheduler不仅可以重试失败的task,还可以重试执行缓慢的task,这就是Spark推测执行机制,默认关闭的,对于ETL的业务一定关闭推测执行。对于数据一直执行不完,首先看有没有数据倾斜,是否开启了推测执行。
粗粒度资源申请和细粒度资源申请
粗粒度资源申请:
任务执行之前,先将所有的资源申请到,task执行的时候不需要自己申请资源,加快了执行速度。如果多数task执行完成,只有一个task没有执行完,那么这批申请到的资源不会被释放,只有所有的task执行完成之后才会释放所有资源。会有集群资源不能充分利用的情况。
细粒度资源申请:
任务执行之前,不会申请所有的资源,task执行时,自己申请资源,自己释放资源,任务执行就慢了,但是集群资源可以充分利用
鼓励一下我呗,谢谢你。
Spark资源调度:
1.启动集群,worker向master汇报资源,master掌握了集群资源
2.提交application时,会创建Driver,当new SparkContext时,会创建两个对象DAGScheduler和TaskScheduler
3.TaskScheduler向master申请资源
4.MAster找到满足资源的worker,启动executor
5.executor启动之后,反向注册给TaskScheduler
Spark的任务调度:
6.当代码中有action算子触发一个job,job中的RDD依赖关系形成一个DAG
7.DAG提交给DAGscheduler,DAGscheduler按照RDD之间的宽窄依赖关系切割job,划分stage,将stage封装到taskset提交到taskScheduler
8.taskscheduler收到taskset,遍历taskset拿到一个个的task,发送的到executor中的threadpool执行
9.Driver监控task执行,回收结果
总结:
1.Taskscheduler可以重试失败的task,重试3次,如果3次之后,依然没有task执行,那么就会由DAGscheduler重试task所在的stage,重试4次,如果还没有成功执行,那么stage所在的job就失败了,job失败,application就失败了。
2.taskScheduler还可以重试执行缓慢的task,就是spark的推测执行机制,默认是关闭的,对于ETL有入库行为的业务,要关闭推测机制
3.遇到数据一直执行不完,1)是否有数据倾斜;2)是否开启了推测执行机制