一 spark application 与job关系
spark application会有几个job,取决于调用了几次DAGScheduler.
如果是spark SQL则取决相应的实现,会存在job group 的情况(多个job)
RDD一般是一个action有一个job,如果take,sample。另外checkpoint也触发一个job.
Spark client模式下,所有的jar和资源都是和driver在一起,不会出现jar丢失的情况,spark可以从hdfs上读取
spark cluster模式下,会出现无法找到jar的情况
二 yarn cluster执行流程
<1> spark client准备阶段
a>.spark client 向 RM发送执行任务请求,RM为其分配applicationID,为其分配hdfs目录[hdf为其分配目录,保存spark执行的资源、依赖,job中间结果(hdfs:///user/用户/.sparkStaging/applicationId
)]
b>.然后把本地配置文件【spark的配置参数,会打成sparkconf.zip的包
】、jar【上传spark程序的jar包,就是你写的工程jar
,spark所需的jar包
】等资源上传至RM为属于自己的hdfs目录
c>.初始化完毕,向RM申请资源
<2> Driver,Executor初始化
a>RM根据请求,查看资源队列,为期分配可用的NM(负责在收到containter创建请求时后创建,不关心执行什么任务),NM进行container创建,并上报创建完毕
b>RM 收到请求后,告知spark client
c> spark client发送命令到NM的container中,创建Application Master,然后有Application Master负责 任务协调,executor容器创建
d> Application Master向RM申请container,准备启动executor容器
e> RM 调度有资源的NM,让其创建container,用于Application Master启动executor
f> Application Master获得NM container后,发送启动executor命令,executor启动后,会进行反向注册到Application Master,进行心跳检测和结果返回,任务调度
<3> spark job执行
a> Driver进行spark job解析,DAGScheduler负责DAG构建,然后根据shuffle 算子进行切分stage,
TaskScheduler将stage分解成TaskSet,然后通过Cluster Manager提交Task到 Application Master
SchedulerBackend(LocalSchedulerBackend,CoarseGrainedSchdulerBack)负责task的启动、停止、kill
Executor接受到Application Master分发的任务进行处理,并不断发送心跳信息,返回最终只想结果,
用于结果聚合和推测执行,故障恢复
<4> 结束阶段
a>Executor结束,Driver结束,
b> Application Master 向RM注销,Application 结束
c>RM,NM等待下一个任务