Spark的通用运行流程分析

  • 直接上总结:看图

Spark的通用运行流程总结

  • 1. 启动集群,然后Worker节点会向Master节点心跳汇报资源(CPU core和Memory)情况

  • 2. Client(客户端)提交Application给资源管理器(Master),根据不同的运行模式在不同的位置创建Driver

  • 3. Driver下的SparkContext连接到Master,向其注册Application并申请资源

  • 4. Master根据申请和Worker心跳周期的报告,决定在哪个Worker上分配资源(Executor)

  • 5. Worker创建Executor进程,启动,然后向Driver反向注册,申请Task(任务)

  • 6. 接收到反向注册后,SparkContext解析Application代码,创建RDD,构建DAG,提交给DAGScheduler分解成Stage(也可以叫TaskSet任务集)

  • 8. 将Stage提交给TaskScheduler分解成Task,并分配给相应的Worker(发送到Executor线程池中)执行

  • 9. 每个Executor中都有一个线程池,Executor通过启动多个线程(Task) 来对RDD的Partition(分区)进行 并行计算,并向SparkContext中的TaskScheduler报告,直到Task完成

  • 10. SparkContext各个Executor接收报告,等所有Task都完成后,向Master申请注销,释放资源

流程解析(以在YARN集群Cluster模式为例)

  • 具体的流程就像上图那样,通用流程就像一个模版,在不同的模式下也会稍有不同。下面我以在YARN Cluster模式为例,带大家过一遍这个流程。

  • 1. 首先,在启动集群后,Worker节点会向ResourceManager(Master)节点汇报资源情况(CPU core和Memory);
  • 2.然后客户端向ResourceManager(Master)发送申请,申请启动ApplicationMaster;
  • 3.ResourceManager选择一台合适的NodeManager(Worker)分配一个Container,然后在Container中开启ApplicationMaster进程,并在ApplicationMaster中初始化Driver和其内部的SparkContext;

这里的话,通用流程的图就要改一下了:

                                                        (没找到好用的画图工具...凑合着看吧)

  • 4. 然后ApplicationMaster中Driver下的SparkContext向ResourceManager(Master)注册Application,并申请资源;
  • 5. ResourceManager(Master)根据提交的申请和各个NodeManager(Worker)心跳周期的报告来决定在哪个NodeManager(Worker)上分配资源(Executor);
  • 6.下面的阶段就像开始总结的通用流程一样了,NodeManager(Worker)创建Executor进程并启动,然后向Driver反向注册,申请Task(任务)
  • 7. Driver接收到Worker节点的反向注册后,Driver下的SparkContext开始解析Application的代码,创建RDD,然后构建DAG(有向无环图);
  • 8.将DAG提交给DAGScheduler(DAG调度器)分解成Stage(也可以叫做TaskSet(Task任务集));
  • 9.将Stage交给TaskScheduler(Task任务调度器)分解成Task,并分配给相应的NodeManager (Worker)中的Executor线程池中
  • 10.Executor通过启动多个线程(Task) 来对RDD的Partition(分区)进行 并行计算,并会不断向SparkContext中的TaskScheduler报告,直到Task完成;
  • 11.最后,SparkContext接收各个Executor中Task中的进度报告,等所有Task都完成后,向Master申请注销,释放资源。

   以上就是整个 Spark On YARN的流程,其中对于Task任务中可能会出现的错误,Spark也有对应的处理方式。

Spark中任务失败的处理

  • 1. Task在Executor线程池中运行时会向TaskScheduler反馈,当Task执行失败时,会由TaskScheduler负责重试,将Task重新发给Executor记性,默认重试3次;如果重试3次依旧失败,那么就会判定这个Task所在的Stage就失败了。该Stage下的所有Task全部终止。
  • 2. Stage失败了会由DAGScheduler负责重试,重新发送TaskSet(Stage)发哦TaskScheduler,默认重试4次;如果重试4次依旧失败,那么就判定这个Job也就失败了,最终由Application提交失败。
  • 3. 还有一点关于Spark的推测执行机制,TaskScheduler不仅能重试失败的Task,还能重试Straggling(落后、缓慢)的Task,如果发现Task运行缓慢,就会创建一个新的Task来执行相同的处理逻辑,这两个Rask哪个先执行完,就以哪个Task的结果为准。这个功能默认是关闭的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值