当前位置: 首页>>hadoop 2.0之YARN>> 阅读正文

YARNMRv2 Node Manager深入剖析—NodeManager启动Container流程分析

Category: hadoop 2.0之YARN View: 6,612 Author: Dong
, , , ,

  • 评论 (4)
  • 引用通告 (0)
发表评论 发起引用

  • 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 回复:

    在YARN看来,他所维护的所有应用程序叫appliction,但是到了计算框架这一层,各自有各自的名字,mapreduce叫job,storm叫topology等等,YARN是资源管理系统,不仅仅运行mapreduce,还有其他应用程序,mapreduce只是一种计算应用。但是yarn内部设有应用程序到计算框架应用程序的映射关系(通常是id的映射),你这里所说的应用程序,job属于不同层面的概念,切莫混淆,要记住,YARN是资源管理系统,可看做云操作系统,其他的东西,比如mapreduce,只是跑在yarn上的application,但是,mapreduce是应用层的东西,它可以有自己的属于,比如job task,但是yarn专业一层是不知道或者说看不到的。

    [回复]

    肥皂 回复:

    原来是这样。看MRAM忘记了这只是针对mapreduce的AM。非常感谢您的回复。

    [回复]

    Dong 回复:

    你再重新读一遍,我又改了一下给你的回复。

    [回复]

    肥皂 回复:

    非常感谢。我明白了您描述的“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 回复:

    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再将他所有信息抹掉。

    [回复]

    肥皂 回复:

    非常感谢您的回复。

    [回复]

  • 2楼ssdutzs 回复

    Post: 2013-09-22 02:44

    您好,请教您一个问题,资源本地化的代码在mapreduce的哪一部分源码中?

    [回复]

    Dong 回复:

    1.0中是TaskTracker.java,2.0中是NodeManager.java

    [回复]

    ssdutzs 回复:

    您好,我看了一下源码,发现在ContainerImpl.java中从LOCALIZING到LOCALIZED状态,只本地化了Job.jar,Job.xml,Job.split等文件,但是没有发现具体要处理的那个数据块被本地化,请问这个数据块的本地化的源码在什么地方呢?非常感谢~

    [回复]

    Dong 回复:

    数据块不需要本地化,是在任务执行时,一点一点读取的。

    [回复]

    ssdutzs 回复:

    原来如此,了解了,谢谢回答~在一点一点读取数据块的时候,如果数据块不在本地,也应该去请求数据块,与放置数据块的节点建立管道,传输数据。那么这部分代码在什么地方呢?
    问这个问题,其实我主要想知道一个任务执行的时候,如果需要计算的数据不在本地,是去哪个节点读取了数据,读取了多少个数据块,想具体看一下这部分的源码

    [回复]

    Dong 回复:

    这部分代码在Client与DataNode上都有,你自己找找。

    [回复]

    ssdutzs 回复:

    好的,谢谢~

    [回复]

  • 3楼farseeing 回复

    Post: 2013-10-16 22:07

    您好,接着1楼的问题,我想问下是否只有负责启动ApplicationMaster的NodeManager才会维护一个Application对象?其他的NodeManager是否是根据ApplicationMaster发起的请求来启动属于这个Application的其他Container,这些NodeManager不需要维护Application的状态机?

    谢谢

    [回复]

    Dong 回复:

    都需要维护,通过Application状态机可将节点上属于这个App的所有Container聚集在一起,当需要特殊操作,比如杀死Application时,可以将对应的所有Container销毁。
    另外,需要注意,一个应用程序的ApplicationMaster所在的节点也可以运行它的container,这都是随机的。

    [回复]

    farseeing 回复:

    非常感谢您的回复,我在源代码里看到了每个ApplicationImpl对象都维护了一个Container的Map。另外,对于运行Container的节点随机性,我的理解是Container运行的节点是由分配资源时集群中哪些节点正好是空闲的来决定的,ResourceManager在为ApplicationMaster分配所需的Container的时候,完全有可能出现ApplicationMaster的本地节点上出现了空闲资源,这样,如果分配成功之后,ApplicationMaster就和所属的Container运行在一个节点上了。

    另外,我想问下ApplicationMaster可以向ResourceManager申请某些特定节点上的Container吗?如果要实现这个功能,需要研究和修改那部分代码?
    非常谢谢!

    [回复]

    Dong 回复:

    可以申请特定节点上的资源。

    [回复]

  • 4楼hadoop 回复

    Post: 2014-08-30 09:33

    大神,我刚启动时jps有datamanager,但过段时间后jps查看datamanager没了,重启后有,但过段时间又没了,请问怎么解决啊

    [回复]

    littlion 回复:

    查看日志,看看原因

    [回复]

目前还没有任何Trackbacks和Pingbacks.
发表评论