赞
踩
http://dongxicheng.org/mapreduce-nextgen/nodemanager-container-launch-process/
NodeManager的一个最重要的功能是根据ApplicationMaster的要求启动container,由于各个节点上的container由ResourceManager进行统一管理和分配的,通常,ResourceManager将Container分配给ApplicationMaster,ApplicationMaster再进一步要求对应的NodeManager启动container。为防止ApplicationMaster未经授权随意要求NodeManager启动container,ResourceManager一般会为每个container分配一个令牌(ApplicationMaster无法伪造),而NodeManager启动任何container之前均会对令牌的合法性进行验证,一旦通过验证后,NodeManager才会按照一定的流程启动该container。本章将介绍NodeManager启动container的详细流程。
正式介绍container启动流程之前,先介绍几个术语:
(1)Application 用户提交的任何一个应用程序,在YARN中被称为Application。
(2)Container 一个Application通常会被分解成多个任务并行执行,其中,每个任务要使用一定量的资源,这些资源被封装成container。详细说来,container不仅包含一个任务的资源说明,还包含很多其他信息,比如Container对应的节点、启动container所需的文件资源、环境变量和命令等信息。
(3)资源本地化 在container中启动任务之前,先要为任务准备好各种文件资源,这些文件资源通常在用户提交应用程序时已上传到HDFS上,而container启动之前,需要下载到本地工作录下,该过程称为资源本地化。
YARN中采用了事件驱动模型,YARN按照事件将各个对象组织起来,如果一个对象存在多种状态,则用一个状态机描述它的生命周期,其中,状态机的状态变化是由事件驱动的,一个事件可以使对象从一个状态转移到另一个状态,同时触发一个行为,而该行为可能在此发出一个事件,使得另外一些对象发生状态转移。
如下如所示,一个时间可以使对象的一个状态转移到另一个状态,也可以转移到多个可能的状态中的一个,这种情况下,具体转移到哪个状态,由行为函数的返回值决定。
NodeManager中包含三个状态机,分别为对象LocalizedResources、Application(由ApplicationImpl实现)和Container(由ContainerImpl实现),具体如下(其中action未画出,这三个图来源为:MAPREDUCE-279):
本节从源代码级别分析container启动过程,具体如下图所示,读者可对照代码阅读以下流程图。
Container的启动开始于ApplicationMaster调用ContainerManager::startContainer(),而NodeManager中的ContainerManagerImpl收到该RPC请求后,经历的整个过程如下所示:
原创文章,转载请注明: 转载自董的博客
本文链接地址: http://dongxicheng.org/mapreduce-nextgen/nodemanager-container-launch-process/
作者:Dong,作者介绍:http://dongxicheng.org/about/
本博客的文章集合:http://dongxicheng.org/recommend/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
1楼肥皂
Post: 2013-06-17 13:42
您好。董学长。很感谢您的分享。
我现在根据事件流程图来学习YARN的工作机制,刚看到NM接受AM传过来的startContainer()。startContainer中有个Application。看了您在上面博客中的描述:“Application 用户提交的任何一个应用程序,在YARN中被称为Application”。我的疑问是:在AM中,job已经被分成一系列的task,并且是为每个task来startContainer。这里为什么NM上要存一个application的数据结构呢?按照我的理解这里的app应该是已经分割成了的task么?但是按照您的博客又有冲突了。
谢谢。期待您的回复。
[回复]
Dong 回复:
六月 17th, 2013 at 下午 11:56
在YARN看来,他所维护的所有应用程序叫appliction,但是到了计算框架这一层,各自有各自的名字,mapreduce叫job,storm叫topology等等,YARN是资源管理系统,不仅仅运行mapreduce,还有其他应用程序,mapreduce只是一种计算应用。但是yarn内部设有应用程序到计算框架应用程序的映射关系(通常是id的映射),你这里所说的应用程序,job属于不同层面的概念,切莫混淆,要记住,YARN是资源管理系统,可看做云操作系统,其他的东西,比如mapreduce,只是跑在yarn上的application,但是,mapreduce是应用层的东西,它可以有自己的属于,比如job task,但是yarn专业一层是不知道或者说看不到的。
[回复]
肥皂 回复:
六月 18th, 2013 at 上午 12:11
原来是这样。看MRAM忘记了这只是针对mapreduce的AM。非常感谢您的回复。
[回复]
Dong 回复:
六月 18th, 2013 at 上午 12:14
你再重新读一遍,我又改了一下给你的回复。
[回复]
肥皂 回复:
六月 18th, 2013 at 上午 12:43
非常感谢。我明白了您描述的“YARN是资源管理系统,运行在它之上的所有应用程序叫application,例如mapreduce就是运行在YARN上的一个application。在mapreduce内部产生了job、task等等对象”。
但是还是有一点疑问:对于Yarn来说,对于每一个运行程序application(例如mapreduce)只维护一个内部application对象么?
比如在Yarn上运行了一个mapreduce(它是跑在yarn上的application这里我能理解),例如当mapreduce中的某个job与NM发生交互时,YARN只能知道是mapreduce这个application再与它进行交互,而无法得知是这个application中的某一个对象再与之进行交互么?这样的话,例如当不同的job(一个application中可以有很多job)与NM进行交互时,Yarn怎样去区别当前job。或者Yarn在维护的那个application数据结构中能够表示该application的哪部分正在运行。
[回复]
Dong 回复:
六月 18th, 2013 at 上午 2:32
YARN不需要知道是job还是其他东西与它交互,在他看来,只有application,YARN为这些applicaiton提供了两类接口,一个是申请资源,具体申请到资源后,applicaiton用来干啥,跑map task还是跑MPI task,YARN不管,二是运行container的命令(container里面包的是task或者其他application内部要跑的东西),一般是一个shell命令,用于启动container(即启动task)。YARN不到application什么时候运行完,他还有几个task没跑,这些只有applicaiton自己知道,当application运行结束后,会告诉YARN,YARN再将他所有信息抹掉。
[回复]
肥皂 回复:
六月 18th, 2013 at 上午 6:25
非常感谢您的回复。
[回复]
2楼ssdutzs
Post: 2013-09-22 02:44
您好,请教您一个问题,资源本地化的代码在mapreduce的哪一部分源码中?
[回复]
Dong 回复:
九月 22nd, 2013 at 上午 3:32
1.0中是TaskTracker.java,2.0中是NodeManager.java
[回复]
ssdutzs 回复:
九月 25th, 2013 at 上午 11:13
您好,我看了一下源码,发现在ContainerImpl.java中从LOCALIZING到LOCALIZED状态,只本地化了Job.jar,Job.xml,Job.split等文件,但是没有发现具体要处理的那个数据块被本地化,请问这个数据块的本地化的源码在什么地方呢?非常感谢~
[回复]
Dong 回复:
九月 26th, 2013 at 上午 1:57
数据块不需要本地化,是在任务执行时,一点一点读取的。
[回复]
ssdutzs 回复:
九月 26th, 2013 at 上午 5:35
原来如此,了解了,谢谢回答~在一点一点读取数据块的时候,如果数据块不在本地,也应该去请求数据块,与放置数据块的节点建立管道,传输数据。那么这部分代码在什么地方呢?
问这个问题,其实我主要想知道一个任务执行的时候,如果需要计算的数据不在本地,是去哪个节点读取了数据,读取了多少个数据块,想具体看一下这部分的源码
[回复]
Dong 回复:
九月 26th, 2013 at 上午 9:09
这部分代码在Client与DataNode上都有,你自己找找。
[回复]
ssdutzs 回复:
九月 26th, 2013 at 上午 11:01
好的,谢谢~
[回复]
3楼farseeing
Post: 2013-10-16 22:07
您好,接着1楼的问题,我想问下是否只有负责启动ApplicationMaster的NodeManager才会维护一个Application对象?其他的NodeManager是否是根据ApplicationMaster发起的请求来启动属于这个Application的其他Container,这些NodeManager不需要维护Application的状态机?
谢谢
[回复]
Dong 回复:
十月 17th, 2013 at 上午 3:53
都需要维护,通过Application状态机可将节点上属于这个App的所有Container聚集在一起,当需要特殊操作,比如杀死Application时,可以将对应的所有Container销毁。
另外,需要注意,一个应用程序的ApplicationMaster所在的节点也可以运行它的container,这都是随机的。
[回复]
farseeing 回复:
十月 17th, 2013 at 下午 8:35
非常感谢您的回复,我在源代码里看到了每个ApplicationImpl对象都维护了一个Container的Map。另外,对于运行Container的节点随机性,我的理解是Container运行的节点是由分配资源时集群中哪些节点正好是空闲的来决定的,ResourceManager在为ApplicationMaster分配所需的Container的时候,完全有可能出现ApplicationMaster的本地节点上出现了空闲资源,这样,如果分配成功之后,ApplicationMaster就和所属的Container运行在一个节点上了。
另外,我想问下ApplicationMaster可以向ResourceManager申请某些特定节点上的Container吗?如果要实现这个功能,需要研究和修改那部分代码?
非常谢谢!
[回复]
Dong 回复:
十月 18th, 2013 at 上午 4:27
可以申请特定节点上的资源。
[回复]
4楼hadoop
Post: 2014-08-30 09:33
大神,我刚启动时jps有datamanager,但过段时间后jps查看datamanager没了,重启后有,但过段时间又没了,请问怎么解决啊
[回复]
littlion 回复:
九月 15th, 2014 at 上午 1:04
查看日志,看看原因
[回复]