一、YARN是集群的资源管理系统
1、ResourceManager:负责整个集群的资源管理和分配。
2、ApplicationMaster:YARN中每个Application对应一个AM进程,负责与RM协商获取资源,获取资源后告诉NodeManager为其分配并启动Container。
3、NodeManager:每个节点的资源和任务管理器,负责启动/停止Container,并监视资源使用情况。
4、Container:YARN中的抽象资源。
二、 SPARK的概念
1、Driver:和ClusterManager通信,进行资源申请、任务分配并监督其运行状况等。运行程序的main方法,创建spark context对象。具体的:1)driver是作业的主进程,具有main函数,并且有SparkContext的实例,是程序的人口点;2)功能:负责向集群申请资源,向master注册信息,负责了作业的调度,,负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。
2、ClusterManager:这里指YARN。
3、DAGScheduler:把spark作业转换成Stage的DAG图。
4、TaskScheduler:把Task分配给具体的Executor。
5、一个application对应一个sparkcontext,app中存在多个job,每个job在不同partition上的执行称为task。
6、client:用户提交程序的入口。
7、worker: worker就类似于包工头。主要功能:管理当前节点内存,CPU的使用状况,接收master分配过来的资源指令,通过ExecutorRunner启动程序分配任务。注意:1)worker不会汇报当前信息给master,worker心跳给master主要只有workid,它不会发送资源信息以心跳的方式给mater,master分配的时候就知道work,只有出现故障的时候才会发送资源。2)worker不会运行代码,具体运行的是Executor是可以运行具体appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。
三、 SPARK on YARN
1. yarn on cluster
(1)ResourceManager接到请求后在集群中选择一个NodeManager分配Container,并在Container中启动ApplicationMaster进程;
(2)在ApplicationMaster进程中初始化sparkContext;
(3)ApplicationMaster向ResourceManager申请到Container后,通知NodeManager在获得的Container中启动excutor进程;
(4)sparkContext分配Task给excutor,excutor发送运行状态给ApplicationMaster。

2. yarn on client
(1)ResourceManager接到请求后在集群中选择一个NodeManager分配Container,并在Container中启动ApplicationMaster进程;
(2)driver进程运行在client中,并初始化sparkContext;
(3)sparkContext初始化完后与ApplicationMaster通讯,通过ApplicationMaster向ResourceManager申请Container,ApplicationMaster通知NodeManager在获得的Container中启动excutor进程;
(4)sparkContext分配Task给excutor,excutor发送运行状态给driver。

3. 区别
- 它们的区别就是ApplicationMaster的区别:yarn-cluster中ApplicationMaster不仅负责申请资源,并负责监控Task的运行状况,因此可以关掉client;而yarn-client中ApplicationMaster仅负责申请资源,由client中的driver来监控调度Task的运行,因此不能关掉client。
- client适合调试,dirver运行在客户端; cluster适合生产,driver运行在集群子节点,具有容错功能
四、 job stage task
- job : A job is triggered by an action, like count() or saveAsTextFile(). Click on a job to see information about the stages of tasks inside it. 所谓一个 job,就是由一个 rdd 的 action 触发的动作,可以简单的理解为,当你需要执行一个 rdd 的 action 的时候,会生成一个 job。
- stage : stage 是一个 job 的组成单位,就是说,一个 job 会被切分成 1 个或 1 个以上的 stage,然后各个 stage 会按照执行顺序依次执行。由job->stage,其划分原则是从宽依赖分隔。因为从宽依赖,所以子RDD的partition会依赖多个父RDD的partition,有些可能就没有准备好,所以进行划分处理。
- task : A unit of work within a stage, corresponding to one RDD partition。即 stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。
- spark作业提交流程:
Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。 -
stage切割规则:从后往前,遇到宽依赖就切割stage
stage_task.png
- spark工作机制:
答:用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。
执行add算子,形成dag图输入dagscheduler,按照add之间的依赖关系划分stage输入task scheduler。 task scheduler会将stage划分为task set分发到各个节点的executor中执行。
五、 RDD之间的宽依赖、窄依赖
- 窄依赖:表示父亲 RDD 的一个分区最多被子 RDD 一个分区所依赖。有shuffle产生,父RDD的一个分区的数据去到子RDD的不同分区里
例如:map filter union - 宽依赖:表示父亲 RDD 的一个分区可以被子 RDD 的多个子分区所依赖。没有shuffle产生,父的一个分区数据到了子RDD的一个分区
例如:groupByKey group sort
网友评论