Spark内部执行机制

基本概念

  1. 应用程序:用户构建的Spark应用程序,包含驱动程序(一个Driver功能的代码)和在集群的多个工作结点上运行的Executor代码。
  2. 驱动程序:包含main入口函数并在main函数内实例化SparkContext对象的应用程序称为驱动应用程序。不说了,直接上代码如下:
             Var logFile="YOUR_SPARK_HOME/README.md"//本地文件目录
             val conf=new SparkConf().setAppName("Simple Application");//给Application命名
             val sc=new SparkContext(conf);
  3. Master(ClusterManager):管理者整个集群,目前Spark主要支持三种类型:Standlone模式,Mesos模式,Yarn模式。
  4. Worker节点:运行Worker守护进程的集群结点。
  5. 任务执行器(Executor):一个Worker节点上可能有多个Executor, 每个Executor都拥有固定的核心数量和堆栈大小。
  6. RDD Graph:RDD是Spark的核心结构, 可以通过一系列算子进行操作(主要有Transformation和Action操作)。当RDD遇到Action算子时,将之前的所有算子形成一个有向无环图(DAG)。再在Spark中转化为Job,提交到集群执行。一个App中可以包含多个Job
  7. 作业(job):包含多个Task(任务)组成的并行计算(并排的那些分区)),往往由Spark的action触发产生。在Spark中通过runJob方法向Spark集群中提交Job
  8. 阶段(Stage):每个job会因为RDD之间的依赖关系被拆分成多个Task集合,其名称称为Stage,每一个Task集合,也可以叫TaskSet(任务集)
  9. Task:一个分区对应一个Task,Task执行RDD中对应Stage中包含的算子。Task被封装好后放入Executor的线程池中执行
  10. DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
  11. TaskScheduler:将Taskset提交给Worker node集群运行并返回结果

每个Application中可能有多个job,相互独立。
每个Worker可以起一个或多个Executor。
每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
每个Task执行的结果就是生成了目标RDD的一个partiton。

1、Spark内部执行机制

1.1 内部执行流程

        如图为分布式集群上spark应用程序的一般执行框架。主要由sparkcontext(spark上下文)、cluster manager(资源管理器)和executor(单个节点的执行进程)。其中cluster manager负责整个集群的统一资源管理。executor是应用执行的主要进程,内部含有多个task线程以及内存空间。

 

其详细运行流程如下:

  1. 应用程序在使用spark-submit提交后,根据提交时的参数设置(deploy mode)在相应位置初始化spark context,即spark的运行环境,并创建DAG Scheduler和Task Scheduer,Driver根据应用程序执行代码,将整个程序根据action算子划分成多个job,每个job内部构建DAG图,DAG Scheduler将DAG图划分为多个stage,同时每个stage内部划分为多个task,DAG Scheduler将taskset传给Task Scheduer,Task Scheduer负责集群上task的调度。至于stage和task的关系以及是如何划分的我们后面再详细讲。
  2. Driver根据sparkcontext中的资源需求向resource manager申请资源,包括executor数及内存资源。
  3. 资源管理器收到请求后在满足条件的work node节点上创建executor进程。
  4. Executor创建完成后会向driver反向注册,以便driver可以分配task给他执行。
  5. 当程序执行完后,driver向resource manager注销所申请的资源。

下面这张图更好理解:

1.2 Job、Stage、Task的关系

       Job、Stage和Task是spark任务执行流程中的三个基本单位。其中job是最大的单位,Job是spark应用的action算子催生的;stage是由job拆分,在单个job内是根据shuffle算子来拆分stage的,单个stage内部可根据操作数据的分区数划分成多个task。如下图所示:

2、RDD的执行流程

        在上面介绍了spark应用程序的大概执行流程,由于spark应用程序中的数据块基本都是RDD,接下来来看下应用程序中RDD的执行流程。

2.1 RDD从创建到执行

RDD从创建到执行的流程如下图所示:

RDD执行流程如下:

  1. 任何的Spark应用程序都包含Driver和Executor代码。Spark应用程序首先在Driver初始化SparkContext。因为SparkContext是Spark应用程序通往集群的唯一途径。在SparkContext里面包含了两个调度器,一个是DAGScheduler和TaskScheduler,在创建SparkContext对象的同时也自动创建了这两个类。
  2. SparkContext初始化完成后,首先根据Spark的相关配置,想Cluster Master申请所需要的资源,然后在各个Worker结点初始化相应的Executor。Executor初始化完成后,Driver将通过对Spark应用程序中的RDD代码进行解析,生成相应的RDD graph(RDD图),该图描述了RDD的相关信息及彼此之间的依赖关系。即是图中第一个部分,这些RDD Objects
  3. RDD图构建完毕后,Driver将提交给DAGScheduler进行解析。DAGScheduler在解析RDD图的过程中,当遇到Action算子后将进行逆向解析,根据RDD之间的依赖关系,以及是否存在Shuffle,将RDD图解析成一系列具有先后依赖关系的Stage。Stage以shuffle进行划分,即如果两个RDD之间存在依赖关系,DAGScheduler将会在这RDD之间拆分为两个Stage进行执行,且只有前一个Stage执行完毕之后,才执行后一个Stage。
  4. DAGScheduler将划分的一系列的Stage(TaskSet),按照Stage的先后顺序依次提交给底层的调度器TaskScheduler执行。
  5. TaskScheduler接收到DAGScheduler的stage任务后,将会在集群环境中构建一个TaskSetManager实例来管理Stage(TaskSet)的生命周期。
  6. TaskSetManager将会把相关的计算代码,数据资源文件等发送到相应的Executor上,并在相应的Executor上启动线程池执行。
  7. 在Task执行的过程中,可能有部分应用程序涉及到I/0的输入输出,在每个Executor由相应的BlockManager进行管理,相关BlockManager的信息将会与Driver中的Blocktracker进行交互和同步。
  8. 在TaskThreads执行的过程中,如果存在运行错误,或其他影响的问题导致失败,TaskSetManager将会默认尝试3次,尝试均失败后将上报TaskScheduler,TaskScheduler如果解决不了,在上报DAGScheduler,DAGScheduler将根据各个Worker结点的运行情况重新提交到别Executor中执行。
  9. TaksThread执行完毕后,将把执行的结果反馈给TaskSetManager,TaskSetManager反馈给TaskScheduler,TaskScheduler在上报DAGScheduler,DAGScheduler将根据是否还存在待执行的的Stage,将继续循环迭代提交给TaskScheduler去执行。
  10. 待所有的Stage都执行完毕后,将会最终达到应用程序的目标,或者输出到文件,或者在屏幕显示等,Driver的本次运行过程结束,等待用户的其他指令或者关闭。
  11. 在用户显示关闭SparkContext,整个运行过程结束,相关的资源或被释放,或被回收。

2.2 DAG Scheduler工作流程

        DAG Scheduler是一个高级的scheduler层,他实现了基于stage的调度,他为每一个job划分stage,并将单个stage分成多个task,然后他会将stage作为taskSet提交给底层的Task Scheduler,由Task Scheduler执行。

  针对左边的一段代码,DAG Scheduler根据collect(action算子)将其划分到一个job中,在此job内部,划分stage,如上右图所示。DAG Scheduler在DAG图中从末端开始查找shuffle算子,上图中将reduceByKey为stage的分界,shuffle算子只有一个,因此分成两个stage。前一个stage中,RDD在map完成以后执行shuffle write将结果写到内存或磁盘上,后一个stage首先执行shuffle read读取数据在执行reduceByKey,即shuffle操作。

2.3 TASK Scheduler工作流程

       Task Scheduler是sparkContext中除了DAG Scheduler的另一个非常重要的调度器,task Scheduler负责将DAGS cheduer产生的task调度到executor中执行。如下图6所示,Task Scheduler 负责将TaskSetPool中的task调度到executor中执行,一般的调度模式是FIFO(先进先出),也可以按照FAIR(公平调度)的调度模式,具体根据配置而定。其中FIFO:顾名思义是先进先出队列的调度模式,而FAIR则是根据权重来判断,权重可以根据资源的占用率来分,如可设占用较少资源的task的权重较高。这样就可以在资源较少时,调用后来的权重较高的task先执行了。至于每个executor中同时执行的task数则是由分配给每个executor中cpu的核数决定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值