spark的执行流程(源码解说)

1>spark的作业主要是由rdd的action所触发作业的提交,根据提交作业构建DAG图。将作业提交给sparkcontxt,在sparkcontext会创建2个重要组件,一个是dagscheduler和taskscheduler组件。最终运行sc.runjob将作业提交给Dagscheduler

2>Dagscheduler会根据DAG图进行stage的划分

                        划分原理:dagscheduler调用handlejob.submit方法=>在该方法中根据dag图寻找到最后一个finaldd,=>以最后一个rdd为起点,去遍历rdd生命线,在遍历的过程中查找是否存在shufflerdd(如果存在就进行作为stage的划分依据)=》直到遍历到第一个rdd为止 =>stage划分完之后=>建立stage和stage的依赖关系,并放到list的集合中,作为后续调度的依据

3>dagscheduler将每个stage划分为多个task(按照分区划分),并给出每个task执行的首选位置,将这些task封装为taskset

4>Dagscheduler将这些已经封装好的taskset发送给taskscheduler,taskscheduler会将这些taskset放入到taskset缓冲迟中,其实现类taskschedulerimpl会创建tasksetmanager来进行管理taskset(主要管理taskset的生命周期) taskscheduler会调用resourceoffers方法,将tasksetmanager进行一个排序,以便进行资源的分配,同时调用schduledbacked方法,在该方法中与driverendpoint端点通信=>获取可用的executor列表

5>在具备4条件,taskscheduler将taskset发送到对应的exeutor上去执

6>executor在接受到taskscheduler下发的任务,会调用自生的executor.lunchtask方法执行任务,最终调用task.runtask方法
7>对于执行完的任务,存在2种结果resulttask(将结果数据返回给driver),shufflemaptask(会将数据进行一个保存,一遍下游的使用)

你可能感兴趣的:(spark的执行流程(源码解说))