Spark on Yarn

Spark on Yarn

1.Yarn概述

YARN(Yet Another Resource Negotiator)核心思想是将资源管理和任务的监控和调度分离
通用的资源管理系统,可为不同的应用(MapReduce、Spark、Flink等)提供统一的资源管理和调度

2.YARN的基本架构核心组件

YARN的架构是master/slaves的主从架构:

  • master:ResourceManager->全局资源管理,负责集群全局统一的资源管理、调度、分配
  • slave:NodeMannager->结点资源管理器,启动了NodeManager进程的节点,负责管理节点的资源及使用情况

2.1YARN架构核心组件-ResouceManager

ResourceManager组成:

  • ResourceScheduler->资源调度器,根据节点的容量、队列情况,为应用程序分配资源
  • Application Manager->应用程序管理器,负责接受Client端传输的job请求

ResourceManager功能:

  • 对高层:处理客户端请求
  • 对低层:监控NodeManager ,启动和监控ApplicationMaster,进行必要的重启
  • 整体: 负责整个系统的资源分配和调度

2.2YARN架构核心组件-NodeManager

NodeManager功能:

  • 本节点上的资源管理和任务管理
  • 定时向ResourceManager汇报本节点上的资源使用情况和各个Container的运行情况
  • 接收和处理来自ResourceManager的Container启动和停止的各种命令
  • 处理来自ApplicationMaster的指令,比如启动MapTask和ReduceTask指令

2.3YARN架构核心组件-ApplicationMaster

ApplicationMaster功能:

  • 每个应用程序对应一个ApplicationMaster,负责单个应用程序的管理
  • 为应用程序向ResourceManager申请资源(Container),并分配内部任务
  • 与NodeManager通信来启动/停止任务,Task都是运行在Container中的

2.4YARN架构核心组件-Container

Container是YARN中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。Container类似于一个虚拟机,可以在上面执行任务

2.5YARN的工作机制

在这里插入图片描述

3.Spark on Yarn

以前没有YARN的时候,每个分布式框架都要跑在一个集群上面,比如说Hadoop要跑在一个集群上,Spark用集群的时候跑在standalone上等等。而且每个分布式框架在各自的集群上跑的时候,都有高峰期低峰期的时候,每个时间点也可能不一样。这样的话整个集群的资源的利用率非常的低。而且管理起来比较麻烦,因为每个框架都跑在各自的集群上,要去分别管理。那么能不能进行统一的资源管理和调度?这样YARN就产生了。

为了方便理解,将YARN的工作机制进行一定的简化:
在这里插入图片描述

  1. client(比如spark)提交一个作业到RM上;
  2. RM会找一个NM,并在上面启动一个Container;
  3. 在Container里面跑AM(作业的主程序);
  4. 一个作业如果要跑的话要申请资源的,所以AM要到RM上面去申请资源。假如说现在拿到了资源:可以在三个NM上面分别启动Container。
  5. 拿到了资源列表后,去三个NM上面启动分别启动Container来运行task。 上面是一个通用的执行流程。

对于MR来说,这个task是map task或者reduce task;对于Spark来说,这个task就是executor
如果是MR的话,那么AM就是MapReduce的Application Master主程序(main函数驱动程序),如果是Spark的话就是Spark的的Application Master主程序(main函数驱动程序)。

3.1spark executor

前面提到的在spark中的task即为executor,一个Spark应用程序包含一个driver和多个executor。executor是进程级别,一个进程上面可以并行的跑多个线程的,所以每个executor上面可以跑多个task。

注意:这里出现了两个task,第一个为抽象的任务描述,在不同的框架中对应不同的任务指令,第二个task则是具体的任务。

MapReduce和Spark一个本质的区别:

  • 在MapReduce里,一个task就是一个进程,当一个task完成(maptask或者reducetask)后,这个task进程就结束了。
  • 在Spark里,它的task能够并发的运行在一个进程里,即一个executor ,这个进程会在Spark Application的整个生命周期一直存在,即使你的作业不再运行了,job运行完了,没有作业在running,它的executor还是一直在的

对比MapReduce和Spark可知,MapReduce是基于进程的base-process,Spark是基于线程的base-thread

这样的话,Spark带来的好处就是:
如果是MR的话,你跑task的进程资源都要去申请,用完之后就销毁;但是Spark的话,只要一开始拿到了这些进程资源,后面所有的作业,不需要申请资源,就可以直接快速的启动,是非常的快。用内存的方式进行计算。

3.2spark task

从上面知道一个executor进程中并行运行多个task线程,spark调度涉及job、stage、task三个概念:

  1. Job是以Action方法为界,遇到一个Action方法则触发一个Job;
  2. Stage是Job的子集,以RDD宽依赖(即Shuffle)为界,遇到Shuffle做一次划分;
  3. Task是Stage的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个task。

3.3spark RDD

了解了spark工作流程,那么数据从何而来,下面就要提到spark的一个重要概念RDD。
弹性分布式数据集(Resilient Distributed Datasets),是一种容错的、可以被并行操作的元素集合,是 Spark 对所有数据处理的一种基本抽象。Spark 中的计算过程可以简单抽象为对 RDD 的创建转换返回操作结果的过程:

  • makeRDD:可以通过访问外部物理存储(如 HDFS)读取文件并创建一个 RDD,也可以对输入数据集合创建一个 RDD。RDD
    被创建后不可被改变,只可以对 RDD 执行 Transformation 及 Action 操作。
  • Transformation(转换):对已有的 RDD 中的数据执行计算进行转换,并产生新的 RDD,在这个过程中有时会产生中间 RDD。Spark 对于Transformation采用惰性计算机制,即在 Transformation 过程并不会立即计算结果,而是在Action才会执行计算过程。如map、filter、groupByKey、cache等方法,只执行Transformation操作,而不计算结果。
  • Action(执行):对已有的 RDD 中的数据执行计算产生结果,将结果返回 Driver 程序或写入到外部物理存储(如HDFS)。如reduce、collect、count、saveAsTextFile等方法,会对 RDD 中的数据执行计算。
RDD 依赖关系

Spark 中 RDD 的每一次Transformation都会生成一个新的 RDD,这样 RDD 之间就会形成类似于流水线一样的前后依赖关系,在 Spark 中,依赖关系被定义为两种类型,分别是窄依赖和宽依赖:

  • 窄依赖(NarrowDependency):每个父 RDD 的一个分区最多被子 RDD 的一个分区所使用,即 RDD之间是一对一的关系。窄依赖的情况下,如果下一个 RDD 执行时,某个分区执行失败(数据丢失),只需要重新执行父 RDD的对应分区即可进行数恢复。例如map、filter、union等算子都会产生窄依赖。
  • 宽依赖(WideDependency,或 ShuffleDependency):是指一个父 RDD 的分区会被子 RDD的多个分区所使用,即 RDD之间是一对多的关系。当遇到宽依赖操作时,数据会产生Shuffle,所以也称之为ShuffleDependency。宽依赖情况下,如果下一个RDD 执行时,某个分区执行失败(数据丢失),则需要将父 RDD的所有分区全部重新执行才能进行数据恢复。例如groupByKey、reduceByKey、sortByKey等操作都会产生宽依赖。
    在这里插入图片描述

3.4spark Partition Job Stage Task

3.2中对这几个概念有所提及,只是为了在executor紧接着补上相应的理论,在这里地这几个概念进行扩充。

Partition

partition(分区)是 Spark 中的重要概念,它是RDD的最小单元,RDD是由分布在各个节点上的partition 组成的。partition的数量决定了task的数量,每个task对应着一个partition。在这里插入图片描述

Job

前面提到,RDD 支持两种类型的算子操作:Transformation和Action。Spark 采用惰性机制,Transformation算子的代码不会被立即执行,只有当遇到第一个Action算子时,会生成一个Job,并执行前面的一系列Transformation操作。一个Job包含N个Transformation和 1 个Action。

Stage

Spark 在对Job中的所有操作划分Stage时,一般会按照倒序进行(这个倒序非常关键),依据 RDD 之间的依赖关系(宽依赖或窄依赖)进行划分。即从Action开始,当遇到窄依赖类型的操作时,则划分到同一个执行阶段;遇到宽依赖操作,则划分一个新的执行阶段,且新的阶段为之前阶段的Parent,之前的阶段称作Child Stage,然后依次类推递归执行。Child Stage需要等待所有的Parent Stage执行完之后才可以执行,这时Stage之间根据依赖关系构成了一个大粒度的 DAG。

Task

Task为一个Stage中的一个执行单元,也是 Spark 中的最小执行单元,一般来说,一个 RDD 有多少个Partition,就会有多少个Task,因为每一个Task 只是处理一个Partition上的数据。在一个Stage内,所有的 RDD 操作以串行的 Pipeline 方式,由一组并发的Task完成计算,这些Task的执行逻辑完全相同,只是作用于不同的Partition。每个Stage里面Task的数目由该Stage最后一个 RDD 的Partition 个数决定。

Spark 中Task分为两种类型,ShuffleMapTask 和 ResultTask,位于最后一个 Stage 的 Task 为 ResultTask,其他阶段的属于 ShuffleMapTask。ShuffleMapTask 和 ResultTask 分别类似于 Hadoop 中的 Map 和 Reduce。

3.5Spark 调度器

以上的所有工作单元都通过调度器从而有序完成任务。Spark 中主要有两种调度器:

  • DAGScheduler:DAGScheduler 主要是把一个 Job 根据 RDD 间的依赖关系,划分为多个 Stage,对于划分后的每个 Stage 都抽象为一个由多个 Task 组成的任务集(TaskSet),并交给 TaskScheduler 来进行进一步的任务调度。
  • TaskScheduler 负责对每个具体的 Task 进行调度。
DAGScheduler

当创建一个 RDD 时,每个 RDD 中包含一个或多个分区,当执行 Action 操作时,相应的产生一个 Job,而一个 Job 会根据 RDD 间的依赖关系分解为多个 Stage,每个 Stage 由多个 Task 组成(即 TaskSet),每个 Task 处理 RDD 中的一个 Partition。一个 Stage 里面所有分区的任务集合被包装为一个 TaskSet 交给 TaskScheduler 来进行任务调度。这个过程由是由 DAGScheduler 来完成的。DAGScheduler 对 RDD 的调度过程如下图所示:
在这里插入图片描述

TaskScheduler

DAGScheduler 将一个 TaskSet 交给 TaskScheduler 后,TaskScheduler 会为每个 TaskSet 进行任务调度,Spark 中的任务调度分为两种:FIFO(先进先出)调度和 FAIR(公平调度)调度。

  • FIFO 调度:即谁先提交谁先执行,后面的任务需要等待前面的任务执行。这是 Spark 的默认的调度模式。
  • FAIR 调度:支持将作业分组到池中,并为每个池设置不同的调度权重,任务可以按照权重来决定执行顺序。

整体流程图如下:在这里插入图片描述

参考:

  • https://blog.csdn.net/qq_40333693/article/details/108599431
  • https://blog.csdn.net/liweihope/article/details/91358144
  • https://www.jianshu.com/p/c364a32d4493
  • https://zhuanlan.zhihu.com/p/99398378
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值