Spark架构及运行机制(7) - Task执行

    TaskScheduler会在集群中选择合适的计算资源提供给TaskSetManager。TaskScheduler在集群中选择的Worker节点需要满足2个条件:

    1)Worker节点内存大小必须满足应用程序设定的executor-memory大小;
    2)Worker节点的内核数可以满足应用程序设定的executor-core数;

    满足条件的Worker节点会为每一个应用程序独立的启动一个Executor进程,由该Executor进程全权负责该应用程序的Task任务,集群中的多个Worker节点的Executor进程在收到Task后,就会开始相互独立的并行完成Task任务。每个Worker节点可以启动多个Executor进程来满足多个应用程序的请求,每个Executor进程都单独运行在Worker节点一个JVM进程中,每个Task则运行在Executor中的一个线程。

    某个应用程序的Executor进程一旦被创建将一直运行,且它的资源可以一直被多批Task人任务复用,直到该Spark程序运行完成才会释放退出。这避免了重复申请资源带来的时间开销。

    Executor会反向逐级向上报告任务的执行状态,如下图所示:


    Executor对任务状态的标识有4种情况:

    1.Executor收到任务后,尚未对Task执行任务,此时Task的状态为RUNNING;
   
    2.如果Task在运行过程中发生错误,此时Task的状态是FAILED,Executor会将错误的原因进行上报;
  
    3.如果Task在中途被人为或其他原因Kill掉,此时Task的状态是KILLED,Executor会将kill的原因上报给TaskScheduler;

    4.如果Task计算完成,此时Task的状态是FINISHED,Executor就会将结果进行保存,并将结果和状态信息反馈给TaskScheduler,并等待TaskScheduler为其分配下一个Task;

    TaskScheduler收到Executor发来的结果及状态信息后,会找到该Task对应的TaskSetManager,将该Task的完成情况通知给对应的TaskSetManager。如果TaskSetManager所维护的Task均完成,TaskSetManager会自动结束关闭。

    如果TaskSetManager对应的Stage是FinalStage,就将运行结果本身返回给DAGScheduler。如果对应的是中间的、由Shuffle操作而被分开的Stage,则返回给DAGScheduler的运算结果在存储模块的相关位置信息,这些存储位置信息将下一个调度Stage的输入数据,下一个Stage读取该输入数据进行计算,就这样反复进行任务分发、任务执行、任务执行信息上报,直到全部任务完成,该应用程序也就执行完成了。

   

猜你喜欢

转载自margaret0071.iteye.com/blog/2387562
今日推荐