首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark 的作业执行原理

Spark 的作业执行原理

作者头像
张凝可
发布2019-08-22 10:52:09
4710
发布2019-08-22 10:52:09
举报
文章被收录于专栏:技术圈技术圈

参见书籍 《图解Spark:核心技术与案例实战》

要点概述

** 作业(Job)提交后由行动操作触发作业执行,根据RDD的依赖关系构建DAG图,由DAGSheduler(面向阶段的任务调度器)解析

** DAGSheduler在解析DAG图时是以RDD的依赖是否为宽依赖,当遇到宽依赖就划分为一个新的调度阶段。每个调度阶段都包含一个或者是多个任务(Task),多个Task组成任务集,提交给TaskSheduler调度运行。

** 每个TaskSheduler只为一个SparkContext实例服务。TaskSheduler接收到来自DAGSheduler发送过来的任务集,负责把任务集以任务的形式一个一个的分发到worker节点的Executor节点上。

** Worker中的Executor节点在收到TaskSheduler发过来的任务以多线程的方式,每一个线程都负责一个任务,任务运行结束后要返回,不同类型的任务返回的结果是不同的,ShuffleMapTask返回的是一个MapStatus对象。

整体的调用图如下图所示

任务的提交

SparkContext 调用DAGSheduler中的runJob方法,调用submitJob方法来继续提交作业,在DAGSheduler的onReceive方法接收提交的任务并完成模式匹配后,调用handleJobSubmitted方法提交作业,并且在这个方法中进行阶段划分。

划分调度阶段

Spark调度阶段的划分在DAGScheduler中的handleJobSubmitted方法中根据最后一个RDD生成ResultStage阶段开始的。具体方法要不断的找到当前stage依赖的祖先RDD是否存在Shuffle操作,如果存在Shuffle操作,则说明本次作业存在一次ResultStage和至少一个ShuffleMapStage,并且根据ShuffleMapStage追溯父调度阶段,一直找到所有的ShuffleMapStage阶段。如果不存Shuffle,则说明只有一个ResultStage.

如上图所示,rddG所存在两个父RDD,join为Shuffle操作,所以以Join操作划分为ResultStage,rddG的父调度分别为rddB和rddF,rddB的父调度rddA不存在Shuffle操作,map操作为窄依赖,所以rddB和rddA属于一个阶段,另外rddF的父调度rddE是窄依赖,rddE是由rddDgroubBy获得的,所以rddE和rddF为一个阶段,而rddC和rddD为另外一个阶段,整个作业被划分为了4个阶段。

提交调度阶段

在生成FinalStage的同时建立起所有调度阶段的依赖关系。按照顺序提交调度阶段进行运行。在调度过程中,有父调度阶段,先把该阶段放到waitingStages列表中,递归调用submitStage直到所有的依赖阶段都准备好,如果没有父调度阶段则使用submitMissingTasks方法提交执行。

比如执行第3个阶段的前提是完成第0个阶段和第2个阶段,而完成第2个阶段的基础是完成第1个阶段,所以ShuffleMapStage0和ShuffleMapStage1两个调度阶段作为第一次调度使用submitMissingTasks方法提交运行。第2次调度只提交shuffleMapStage2运行,在shuffleMapStage2运行完毕后,ResultStage3作为第3次调度阶段完成。

提交任务

在执行DAGSheduler的submitMissingTasks方法时会根据调度阶段的partition划分为相应个数的task,形成任务集,交由TaskSheduler进行处理,对于不同的阶段划分出的task是不同的,对于ResultStage划分为ResultTask,对于shuffleMapStage划分为shuffleMapTask。对于TaskSet包含对应调度阶段的所有任务,这些任务处理逻辑是一样的,不同的是对应处理的数据,而这些在不同task上被处理的数据对应数据分片。

执行任务

task的执行主要依靠Executor的lanuchTask方法,初始化一个TaskRunner封装任务,管理任务执行 的细节,把TaskRunner放到ThreadPool中执行。在TaskRunner中的run方法中,首先会对发送过来的Task本身以及所依赖的JAR文件进行反序列化,然后对反序列化的任务调用Task的runTask方法,runTask方法由它的两个子类ShuffleMapTask和ResultTask来实现的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档