spark on yarn 资源调度流程

cluster模式为例:

客户端向ResourceManager发送请求,ResourceManager返回applicationID和要上传的hdfs目录

客户端将jar包和配置文件上传到hdfs指定目录

客户端向ResourceManager申请资源来启动ApplicationMaster

RM找一台资源充足的NM,进行通信,NM通过rpc的方式从hdfs上下载jar包和配置文件,然后启动ApplicationMaster

ApplicationMaster向RM申请资源来启动容器executor

ResourceManager找到一批符合条件的NodeManager,将信息返回给ApplicationMaster

ApplicationMaster跟对应的NodeManager通信

NodeManager从hdfs上下载jar包和依赖,然后启动executor

executor启动后向Driver反向注册.

spark执行流程

以client模式为例:

client模式Driver是在SparkSubmit进程中

首先创建SparkContext,创建DAGScheduler,创建TaskScheduler

然后跟Master通信,申请资源,然后Master跟Worker通信,Worker启动executor,然后executor向Driver反向注册

通过SparkContext创建RDD

调用Transformation (s) 算子

调用Action,一旦调用Action算子就会形成一个完整的DAG

然后DAGScheduler就会根据RDD的宽依赖来切分stage

stage生成task,然后将task放到taskset中

(一个stage就是一个taskset,每个taskset中的task运算逻辑都是相同的,只是计算的数据不同,一个taskset中有多个task)

然后DAGScheduler将taskset传递给TaskScheduler

TaskScheduler将taskset中的task遍历出来,序列化发送给executor.

然后executor反序列化task,然后用一个实现了Runnable接口的包装类去封装task,然后丢到线程池

第一阶段的task是shufflemaptask,这个task可以读取各种数据源的数据,并且是为shuffle做准备的,他是一边读取数据,一边对数据进行相应的处理.然后将数据溢写到这个task所在机器的磁盘,并且写到磁盘中的数据是分好区的.比如下游有两个task,然后一个shufflemaptask会将溢写的数据写到一个文件,这个文件分了两个分区(有一个索引文件记录了数据文件分区的信息)

然后第一阶段的task执行完成后,会把信息汇报给Driver端的ShuffleManager

然后第二阶段的task要序列化,发送给executor,然后反序列化,丢到线程池

第二阶段的task根据ShuffleManager传递的信息,读取对应的索引文件,读取指定分区的数据,再进行聚合操作,将结果写入到hdfs中.