spark在Yarn上的资源调度和任务调度
目录
一、spark的执行架构
spark代码会分为两部分:Driver端、Executor端
二、spark on yarn的资源调度(申请资源)
大数据引擎的执行过程:
1、资源调度(申请资源):申请CPU、内存、Executor的数量
2、任务调度(执行task)
1、spark on yarn client模式的执行流程图
spark--粗粒度资源申请
spark会在任务执行之前将所有的资源全部申请下来。
task在执行的时候不需要再单独申请资源,直接发送到Executor中执行,启动快。
但是spark需要等待所有的task执行完成才会释放资源,会导致资源浪费
MapReduce--细粒度资源申请
每一个task在执行的时候自己去申请资源。
task启动之前需要先申请资源,启动就会变慢,整个任务执行就会变慢。
每一个task单独申请资源,不会占用额外的资源
Driver的功能是将task发送到Executor中执行。
Driver是知道整个任务执行进度的,在本地可以看到详细的执行日志。
如果在本地提交大量的spark任务,会导致本地服务器的网卡流量剧增,
所以client模式一般用于上线前的测试,可以看到日志方便调试
2、spark on yarn cluster模式
yarn cluster模式,Driver不在本地启动,在本地也没有详细的日志,
不会导致某台服务器网卡剧增,一般用于上线使用
三、spark on yarn的任务调度(执行task)
spark程序结构(由大到小)
1、Application:应用程序
2、Job:由action算子触发(代码中有多少action算子就有多少个Job)
3、stage:由宽依赖切分得到,是一组可以并行计算的task
4、task:线程对象,task中封装了算子的代码逻辑(底层会自动封装)
Application:基于Spark的应用程序,包含了driver程序和集群上的executor DriverProgram:Driver代码,算子之外的代码。运行main函数并且新建SparkContext的程序 ClusterManager:在集群上获取资源的外部服务(例如standalone,Mesos,Yarn ) WorkerNode:集群中任何可以运行应用用代码的节点 Executor:执行task。 是在一个workernode上为某应用用启动的一个进程,该进程负责运行任务, 并且负责将数据存在内存或者磁盘上。每个应用用都有各自自独立的executors Task:数量由分区和shuffle决定。被送到某个executor上的执行单元 Job:包含很多任务的并行计算的task, 可以看做和Spark的action对应,每个action都会触发一个job任务 Stage:一个Job会被拆分很多组任务,每组任务被称为Stage (就像MapReduce分map任务和reduce任务一样)
1、宽依赖和窄依赖
宽依赖:一分区对多分区,产生shuffle
窄依赖:一分区对 一分区,不产生shuffle
2、任务调度解释说明
如果task执行失败,Task调度器会重试3次再继续执行task,
如果Task调度器重试3次失败,DAG调度器会重试Task调度器4次,
如果DAG调度器会重试Task调度器4次失败,那么就会报错
3、资源调度和任务调度的执行流程图(yarn client模式)
如果task执行失败,TaskScheduler会重试3次,如果还失败,由DAGScheduler重试Stage4次。
如果是因为shuffle文件找不到出现的溢出,TaskScheduler不负责重试task,
而是由DAGScheduler重试上一个Stage
推测执行:如果有一个task执行很慢,TaskScheduler会再发送一个一样的task去竞争