Scala任务调度+资源调度
以Client方式提交Application
具体流程
1)先启动Spark集群,启动成功后所有Worker节点就会向Master节点心跳反馈,而Master节点中的Workers集合也会储存worker地址信息及资源信息;
2)用户提交Application,通过执行提交的Application启动Driver进程,Driver进程包含DAGScheduler对象和TaskScheduler对象;
3)当DAGScheduler对象和TaskScheduler对象创建完成后,会向Master为Application申请资源;
4)Master节点会向WaitingApps集合中添加新元素并且调用schedule()方法,schedule()方法会根据集群的资源情况找到合适的Worker节点启动Executor进程(默认情况下,每一个Worker节点会为当前Application启动一个Executor进程,该Executor进程会使用1GB内存和该Worker节点管理的所有Core核心数);
5)当Executor启动成功后,会向TaskScheduler,这时TaskScheduler对象就会有Executor的信息;
6)DAGScheduler会根据RDD的宽窄依赖,将Job划分成一个个Stage,每一个Stage由一组Task组成,每一个Task都是PipeLine计算模式;
7)TaskScheduler会根据数据调用HDFS的API拿到数据的Block块以及位置;
8)TaskScheduler会根据数据位置分发Task并监控Task的执行情况;(如果Task失败或者挣扎,会重试发送失败的Task;
资源调度分类
粗粒度资源调度
描述:在Task执行之前就已经将资源申请完毕,当所有的Task执行完毕时,所用的资源才会被释放;
优点:不需要Task自己去申请资源,而是直接去使用已经申请到的资源,从而Task启动时间大大缩短,从而提高任务执行效率;
缺点:所有的Task执行完毕才会释放所占用的资源,若整个Application中有一个Waiting Task,那么资源就不会释放,集群的资源就无法充分利用;
典型代表:Spark
细粒度资源调度
描述:Application提交之后,每一个Task自己去申请资源,申请到资源才会开始执行,执行完毕后立即释放资源;
优点:执行前申请资源,执行完毕后释放资源,有利于集群资源利用;
缺点:所有的Task都需要自己去申请资源,这样每个Task都要有申请资源的时间,从而Application的执行效率降低;
典型代表:Map/Reduce