网站正在建设中页面的英文,做甜品网站栏目,网站服务搭建,封面模板零、本节学习目标
理解DAG概念了解Stage划分了解RDD在Spark中的运行流程
一、有向无环图
#xff08;一#xff09;DAG概念
DAG#xff08;Directed Acyclic Graph#xff09;叫做有向无环图#xff0c;Spark中的RDD通过一系列的转换算子操作和行动算子操作形成了一个…零、本节学习目标
理解DAG概念了解Stage划分了解RDD在Spark中的运行流程
一、有向无环图
一DAG概念
DAGDirected Acyclic Graph叫做有向无环图Spark中的RDD通过一系列的转换算子操作和行动算子操作形成了一个DAG。DAG是一种非常重要的图论数据结构。如果一个有向图无法从任意顶点出发经过若干条边回到该点则这个图就是有向无环图。“4→6→1→2”是一条路径“4→6→5”也是一条路径并且图中不存在从顶点经过若干条边后能回到该点。 二实例讲解
根据RDD之间依赖关系的不同可将DAG划分成不同的Stage(调度阶段)。对窄依赖来说RDD分区的转换处理是在一个线程里完成所以窄依赖会被Spark划分到同一个Stage中而对宽依赖来说由于有Shuffle存在所以只能在父RDD处理完成后下一个Stage才能开始接下来的计算因此宽依赖是划分Stage的依据当RDD进行转换操作遇到宽依赖类型的转换操作时就划为一个Stage。 A、C、E是三个RDD的实例当A做groupByKey转换操作生成B时由于groupByKey转换操作属于宽依赖类型所以就把A划分为一个Stage如Stage1。当C做map转换操作生成D D与E做union转换操作生成F。由于map和union转换操作都属于窄依赖类型因此不进行Stage的划分而是将C、D、E、F加入到同一个Stage中。当F与B进行join转换操作时由于这时的join操作是非协同划分所以属于宽依赖因此会划分为一个Stage如Stage2。剩下的B和G被划分为一个Stage如Stage3。
二、Stage划分依据
Spark会根据DAG将整个计算划分为多个阶段每个阶段称为一个Stage。每个Stage由多个Task任务并行进行计算每个Task任务作用在一个分区上一个Stage的总Task任务数量是由Stage中最后一个RDD的分区个数决定的。Stage的划分依据为是否有宽依赖即是否有Shuffle。Spark调度器会从DAG图的末端向前进行递归划分遇到Shuffle则进行划分Shuffle之前的所有RDD组成一个Stage整个DAG图为一个Stage。
一两阶段案例
经典的单词计数执行流程的Stage划分如下图所示。 上图中的依赖关系一共可以划分为两个Stage从后向前进行递归划分RDD3到RDD4的转换是Shuffle操作因此在RDD3与RDD4之间划开继续向前查找RDD1、RDD2、RDD3之间的关系为窄依赖因此为一个Stage整个转换过程为一个Stage。
二三阶段案例
下图中的依赖关系一共可以划分为3个Stage从后向前进行递归划分由于RDD6到RDD7的转换是Shuffle操作因此在RDD6与RDD7之间划开然后继续向前查找RDD3、RDD4、RDD5、RDD6为一个Stage由于RDD1到RDD2的转换是Shuffle操作因此在RDD1与RDD2之间划开然后继续向前查找RDD1为一个Stage整个转换过程为一个Stage。 三、RDD在Spark中的运行流程
Spark的任务调度流程即RDD在Spark中的运行流程分为RDD Objects、DAGScheduler、TaskScheduler以及Worker四个部分。 一RDD Objects
当RDD对象创建后SparkContext会根据RDD对象构建DAG有向无环图然后将Task提交给DAGScheduler。
二DAGScheduler
将作业的DAG划分成不同Stage每个Stage都是TaskSet任务集合并以TaskSet为单位提交给TaskScheduler。
三TaskScheduler
通过TaskSetManager管理Task并通过集群中的资源管理器把Task发给集群中Worker的Executor。
四Worker
Spark集群中的Worker接收到Task后把Task运行在Executor进程中一个进程中可以有多个线程在工作从而可以处理多个数据分区。