1. spark 如何执行程序?app
首先看下spark 的部署图:oop
节点类型有:spa
1. master 节点: 常驻master进程,负责管理所有worker节点。blog
2. worker 节点: 常驻worker进程,负责管理executor 并与master节点通讯。进程
dirvier:官方解释为: The process running the main() function of the application and creating the SparkContext。即理解为用户本身编写的应用程序内存
Executor:执行器:hadoop
在每一个WorkerNode上为某应用启动的一个进程,该进程负责运行任务,而且负责将数据存在内存或者磁盘上,每一个任务都有各自独立的Executor。部署
Executor是一个执行Task的容器。它的主要职责是:it
一、初始化程序要执行的上下文SparkEnv,解决应用程序须要运行时的jar包的依赖,加载类。spark
二、同时还有一个ExecutorBackend向cluster manager汇报当前的任务状态,这一方面有点相似hadoop的tasktracker和task。
总结:Executor是一个应用程序运行的监控和执行容器。Executor的数目能够在submit时,由 --num-executors (on yarn)指定.
Job:
包含不少task的并行计算,能够认为是Spark RDD 里面的action,每一个action的计算会生成一个job。
用户提交的Job会提交给DAGScheduler,Job会被分解成Stage和Task。
Stage:
一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage。
Stage的划分在RDD的论文中有详细的介绍,简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task,一类是shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依据,shuffle以前的全部变换是一个stage,shuffle以后的操做是另外一个stage。好比 rdd.parallize(1 to 10).foreach(println) 这个操做没有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;若是是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 这个job由于有reduce,因此有一个shuffle过程,那么reduceByKey以前的是一个stage,执行shuffleMapTask,输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。若是job中有屡次shuffle,那么每一个shuffle以前都是一个stage。
Task
即 stage 下的一个任务执行单元,通常来讲,一个 rdd 有多少个 partition,就会有多少个 task,由于每个 task 只是处理一个 partition 上的数据.
每一个executor执行的task的数目, 能够由submit时,--num-executors(on yarn) 来指定。