目录
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模式提交:
- 客户端提交app的时候或者new SparkConf()的时候,首先在client节点启动一个driver进程。
- driver向master为Executor申请资源。
- Master会遍历waitingWorks过滤出资源充足且Alive的worker节点,在上以轮巡方式启动Executor
- executor向driver反向注册
- driver将APP发送给executor
- driver解析app,创建DAG有向无环图,提交给DAGScheduler,当触发action算子的时候(job产生)DAGScheduler会将job划分为若干个stage,stage会被封装成TaskSet发送给TaskScheduler执行。如果stage执行出错会尝试重试,重试次数4次。若重试4次依然失败,则当前job执行失败。
- TaskScheduler负责将TaskSet中的task分配到相应的worker节点上(计算找数据),并由executor执行,如果执行出错,将尝试重试,重试次数为3次,若三次重试都失败,则返回stage执行失败。
- executor创建线程池,开始执行task,并向driver汇报
- 当所有task执行完成之后,driver执行sc.stop()释放资源(也就是关闭executor)
yarn-cluster模式提交:
- 客户端提交app的时候或者new SparkConf()的时候,首先在client节点启动一个spark-submit进程。submit会向RM为ApplicationMaster (此时的ApplicationMaster 就相当于driver)申请资源
- RM收到请求后会在集群中选择一个 NodeManager,并为该应用程序分配一个 Container,在这个 Container 中启动ApplicationMaster, ApplicationMaster 进行 SparkContext 等的初始化。
- ApplicationMaster 向 ResourceManager 注册,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态
- ApplicationMaster 向master为Executor申请资源。
- ApplicationMaster 申请到资源(也就是Container)后,便与对应的 NodeManager 通信,在其上启动Executor进程。
- executor向ApplicationMaster 反向注册
- 接下来的流程与client基本无二。