Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)
  TEZNKK3IfmPf 2023年11月12日 29 0

一、 Yarn简介

Yarn把 jobtracker的任务分解开来,分为:

  • ResourceManager(简写RM)负责管理分配全局资源
  • ApplicationMaster(简写AM),AM与每个具体任务对应,负责管理任务的整个生命周期内的所有事宜

除了上面两个以外,tasktracker被NodeManager(简写NM)替代,RM与NM构成了集群的计算平台。这种设计允许NM上长期运行一些辅助服务,这些辅助服务一般都是应用相关的,通过配置项指定,在NM启动时加载。例如在yarn上运行mapreduce程序时,shuffle就是一个由NM加载起来的辅助服务。

与每个应用相关的AM是一个框架类库,它与RM沟通协商如何分配资源,与NM协同执行并且监测应用的执行情况。在yarn的设计中,mapreduce只是一种编程模式,yarn还允许像MPI(message passing interface),Spark等应用构架部署在yarn上运行。

二、Yarn设计

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)
上图是一个典型的YARN集群。可以看到RM有两个主要服务:

  • 可插拔的Scheduler,只负责用户提交任务的调度
  • ApplicationsMaster的(简写AsM)负责管理集群中每个任务的ApplicationMaster(简写AM),负责任务的监控、失败重起等

在haodop2.x中,yarn采用了container的概念来分配资源。每个container由一些可以动态改变的属性组成,到现在为止,仅支持内存、cpu两种。但是yarn的这种资源管理方式是通用的,社区以后会加入更多的属性,比如网络带宽,本地硬盘大小等等。

三、Yarn主要组件

 ResourceManager

  • ResourceManager负责整个集群的资源管理和分配,是一个全局的资源管理系统。

  • NodeManager以心跳的方式向ResourceManager汇报资源使用情况(目前主要是CPU和内存的使用情况)。RM只接受NM的资源回报信息,对于具体的资源处理则交给NM自己处理。

  • YARN Scheduler根据application的请求为其分配资源,不负责application job的监控、追踪、运行状态反馈、启动等工作。

 NodeManager

  • NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN集群每个节点都运行一个NodeManager。

  • NodeManager定时向ResourceManager汇报本节点资源(CPU、内存)的使用情况和Container的运行状态。当ResourceManager宕机时NodeManager自动连接RM备用节点。

  • NodeManager接收并处理来自ApplicationMaster的Container启动、停止等各种请求。

 ApplicationMaster

  • 用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在ResourceManager以外的机器上。

  • 负责与RM调度器协商以获取资源(用Container表示)。

  • 将得到的任务进一步分配给内部的任务(资源的二次分配)。

  • 与NM通信以启动/停止任务。

  • 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

  • 当前YARN自带了两个ApplicationMaster实现,一个是用于演示AM编写方法的实例程序DistributedShell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。

注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。

在这小节里,主要介绍yarn各个组件,以及他们之间是如何通信的。

3.1 Client<===>RM

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

上面这个图是Client向RM提交任务时的流程。
(1) Client通过New Application Request来通知 RM 中的AsM(Applications Manager)组件
(2) AsM一般会返回一个新生成的全局ID,除此之外,传递的信息还有集群的资源状况,这样Client就可以在需要时请求资源来运行任务的第一个 container 即 AM。
(3) 之后,Client就可以构造并发送ASC了。ASC中包括了调度队列,优先级,用户认证信息,除了这些基本的信息之外,还包括用来启动 AM 的 CLC 信息,一个CLC中包括jar包、依赖文件、安全token,以及运行任务过程中需要的其他文件

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

经过上面这三步,一个Client就完成了一次任务的提交。之后,Client可以直接通过RM查询任务的状态,在必要时,可以要求RM杀死这个应用。如下图:
Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

3.2 RM <===>AM

RM 在收到 Client 端发送的 ASC (Applicatoin Submission Context)后,它会查询是否有满足其资源要求的 container 来运行 AM,有满足的资源,RM会与那个 container 所在机器上的NM通信,来启动AM。

下面这个图描述了这其中的细节。
Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

(1) AM 向 RM 注册,这个过程包括handshaking过程,并且传递一些信息,包括 AM 监听的 RPC 端口、用于监测任务运行状态的URL等。
(2) RM 中的 Scheduler 部件做回应。这个过程会传递 AM 所需的信息,比如这个集群的最大与最小资源使用情况等。AM利用这些信息来计算并请求任务所需的资源。
(3) 这个过程是AM向RM请求资源。传递的信息主要包含请求 container 的列表,还有可能包含这个 AM 已经释放的 container 的列表。
(4) 在 AM 经过(3)请求资源之后,在稍微晚些时候,会把心跳包与任务进度信息发送给RM
(5) Scheduler在收到AM的资源请求后,会根据调度策略,来分配container以满足AM的请求。
(6) 在任务完成后,AM会给RM发送一个结束消息,然后退出。

在上面(5)与(6)之间,AM在收到RM返回的container列表后,会与每个container所在机器的NM通信,来启动这个container,下面就说说这个过程。

3.3 AM<===>NM

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)
(1) AM向container所在机器的NM发送 CLC(ContainerLaunchContext) 来启动container
(2)(3) 在container运行过程中,AM可以查询它的运行状态

3.4 API

通过上面的描述,开发者在开发YARN上的应用时主要需要关注以下接口:

  • ApplicationClientProtocol

    Client使用这个协议来与RM通信,来启动一个新应用,检查任务的运行状态或杀死任务

  • ApplicationMasterProtocol

    AM使用这个协议来向RM注册/撤销,请求资源来运行任务。

  • ContainerManagementProtocol

    AM使用这个协议来与NM通信,来启动/停止container,查询container的状态。

四、hadoop on  yarn 任务的提交流程

1. 文件 到 切片 的过程 

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

进入 this.connect() 看看里面都做个什么?

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

进入 JobSubmitter 

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

面试题:(任务运行所需的 Jar, xml 文件 是怎么发送到集群的  这里运行时 local 模式)

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

 writeSplits 中定义了 如何将文件 逐一切片Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

local 模式运行 job 运行所需的环境依赖,split 规则,  文件的CRC校验

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

  下面看看 切片 到底是如何 切的?

 Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

进入 writeNewSplits

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

 InputFormat 抽象父类    干了两件事:  1.切片   2.为每个切片生成 RecordReader

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

针对单个文件进行切片

 Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

 

 Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

计算切片的大小 

 Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

Yarn(RM-AM-NM 三大组件的通信,任务提交搭到 Yarn 的过程,文件切片)

文件剩余的大小大于 切片 大小的 1.1  倍才可以 切,  判断的时候按照 1.1 倍 ,真正切的时候 按照 1  倍 去切,  防止切的文件过小, 太小了 我们就不切了

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   168   0   0 html通信flask
  TEZNKK3IfmPf   2023年11月14日   24   0   0 组件
  TEZNKK3IfmPf   2023年11月14日   65   0   0 通信
  TEZNKK3IfmPf   2023年11月14日   35   0   0 TCP通信
  TEZNKK3IfmPf   2023年11月14日   34   0   0 进程通信
  TEZNKK3IfmPf   2023年11月14日   26   0   0 linux进程通信
TEZNKK3IfmPf