spark原理之专用术语和运行流程

目录

spark专用术语

1、Master:

2、Worker

3、Application

4、Driver

5、Executor:执行器

6、RDD:弹性分布式数据集

7、窄依赖

8、宽依赖

9、有向无环图

10、DAGScheduler:有向无环图调度器

11、TaskScheduler:任务调度器

12、Job:作业

13、Stage:调度阶段

15、Task:任务

spark运行流程

Standalone-client模式提交:

yarn-cluster


spark专用术语

在讲spark运行原理之前我们先了解一下spark的一些专业术语。

1、Master:

资源管理的主节点,管理worker从节点。

2、Worker

资源管理的从节点,负责从节点的资源管理,配合master管理整个集群的资源。

3、Application

指的是用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。

4、Driver

任务调度的进程,Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext代表Driver。

5、Executor:执行器

Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。

6、RDD:弹性分布式数据集

Resillient Distributed Dataset,Spark的基本计算单元,可以通过一系列算子进行操作(主要有Transformation,Action和控制类算子)

7、窄依赖

一个父RDD的分区对应于一个子RDD的分区,或多个父RDD的分区对应于一个子RDD 的分区。

8、宽依赖

父子RDD的partition对应关系为一对多,子RDD分区通常对应所有的父RDD分区。如图

常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖)。

常见的宽依赖有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是宽依赖)。

9、有向无环图

Directed Acycle graph,反应RDD之间的依赖关系

10、DAGScheduler:有向无环图调度器

基于DAG划分Stage 并以TaskSet的形式提交Stage给TaskScheduler;负责将job拆分成不同阶段的具有依赖关系的多批Task;最重要的任务之一就是:计算job和task的依赖关系,制定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler。

11、TaskScheduler:任务调度器

将Taskset提交给worker(集群)运行并返回计算结果;负责每个具体任务的实际物理调度。

12、Job:作业

由一个或多个调度阶段所组成的一次计算作业;包含多个Task组成的并行计算,往往由Action算子产生,一个JOB包含多个RDD及作用于相应RDD上的各种Operation。

13、Stage:调度阶段

一个任务集对应的调度阶段;每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;

由一组关联的,但相互之间没有Shuffle依赖关系的任务所组成的任务集。

注意:

1)一个Stage对应一个TaskSet;
2)Stage的每个Rdd分区对应一个Task,多个Task封装成TaskSet

15、Task:任务

被送到Executor上的工作任务;

spark运行流程

spark提交应用程序有两种方式,client模式和cluster模式。

Standalone-client模式提交:

  1. 客户端提交app的时候或者new SparkConf()的时候,首先在client节点启动一个driver进程。
  2. driver向master为Executor申请资源。
  3. Master会遍历waitingWorks过滤出资源充足且Alive的worker节点,在上以轮巡方式启动Executor
  4. executor向driver反向注册
  5. driver将APP发送给executor
  6. driver解析app,创建DAG有向无环图,提交给DAGScheduler,当触发action算子的时候(job产生)DAGScheduler会将job划分为若干个stage,stage会被封装成TaskSet发送给TaskScheduler执行。如果stage执行出错会尝试重试,重试次数4次。若重试4次依然失败,则当前job执行失败。
  7. TaskScheduler负责将TaskSet中的task分配到相应的worker节点上(计算找数据),并由executor执行,如果执行出错,将尝试重试,重试次数为3次,若三次重试都失败,则返回stage执行失败。
  8. executor创建线程池,开始执行task,并向driver汇报
  9. 当所有task执行完成之后,driver执行sc.stop()释放资源(也就是关闭executor)

yarn-cluster模式提交:

  1. 客户端提交app的时候或者new SparkConf()的时候,首先在client节点启动一个spark-submit进程。submit会向RM为ApplicationMaster (此时的ApplicationMaster 就相当于driver)申请资源
  2. RM收到请求后会在集群中选择一个 NodeManager,并为该应用程序分配一个 Container,在这个 Container 中启动ApplicationMaster, ApplicationMaster 进行 SparkContext 等的初始化。
  3. ApplicationMaster 向 ResourceManager 注册,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态
  4. ApplicationMaster 向master为Executor申请资源。
  5. ApplicationMaster 申请到资源(也就是Container)后,便与对应的 NodeManager 通信,在其上启动Executor进程。
  6. executor向ApplicationMaster 反向注册
  7. 接下来的流程与client基本无二。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值