Spark任务调度

Spark任务调度

RDD Objects:
两个RDD合并后分组、过滤
DAGScheduler:
将程序生成DAG图,并切割stage、划分Task(初始partition数量),将一个stage的task封装到一个taskset,并发送至TaskScheduler
TaskScheduler
这个类会向Cluster manager(Yarn)请求资源,获取到资源后,会将TaskSet打散送至申请到的Worker Node中的Executor中执行。为每一个TaskSet维护一个TaskSetManager(追踪本地性及错误信息)
Worker
Threads是Executor里的线程池,Block manager是管理数据的,会在Threads中找一个Thread去执行Task。
最终的计算出来的数据的存储处理都是在Worker Node 中进行的
Tips
1、Worker只关注Task,不关注Stage的成功与否
2、TaskScheduler只关注Stage,不关心Job成功与否
3、Worker中的Task执行失败后会通知TaskScheduler,后者会重新调度Task执行,重试n次之后仍旧失败的话,TaskScheduler会通知DAGScheduler,后者会重新调度Stage执行,重试n次之后仍旧失败,那么当前所执行的Job就失败了。
4、straggling tasks:这种情况是指,比如我们执行一个任务到了百分之90+,后一直卡着不动,这事,停掉可惜,不停浪费时间,即为一种挣扎的状态。straggle任务需要放到别的节点上重试
5、DAGScheduler基于Stage构建DAG,决定每个任务的最佳位置
6、TaskScheduler为什么不直接把Task送至Thread中执行,而是先送到Executor?
因为Executor是一个进程,会有一个接口,所以,只能送到该端口的进程中。无法直接和线程沟通
7、一个Executor里的Task只能属于一个Application,因为一个Executor对应一个jvm进程,该进程里的数据是共享的,所以不能有别的Application的Task,以免数据泄露给其他的Application