跟我一起学Hadoop YARN

Posted 写程序的康德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟我一起学Hadoop YARN相关的知识,希望对你有一定的参考价值。

Hadoop 2.0的本质

很多人提到Hadoop首先想到的是Map/Reduce,其实从2.0开始Hadoop已经从单纯的分布式M/R计算框架变成了通用分布式框架。


上图是Hadoop2.0的技术栈,在Hadoop 2.0中Hadoop底层划分为YARN和HDFS两个部分。YARN提供了集群资源管理,HDFS提供了分布式存储。在此之上开发出来的应用被称为Application,MapReduce就是其中的一个Application。需要注意的是:

  • YARN和HDFS没有任何关系,甚至连代码都是可以彼此独立编译的;

  • YARN和MapReduce也是彻底解耦的,绝对不存在"YARN为了M/R做了特殊优化"的说法;

  • 基于YARN我们可以开发自己的Application,比如Spark就属于YARN上的一个Application。当然这个Application可以和HDFS没有关系也可以和M/R没有关系;

所以Hadoop2.0本质上是一个技术框架(Framework),最重要的核心组件是YARN,基于YARN你可以轻松开发一个分布式系统。

YARN

YARN(Yet Another Resource Negotiator)是一个分布式资源管理框架,可以把它理解为一种基础设施——提供了资源分配、调度、执行环境的基础设施(听起来像不像分布式操作系统)。

跟我一起学Hadoop YARN(一)

  • ResourceManager,整个集群中只能有一个它掌握了整个集群的资源分布情况,响应资源申请,为Application分配资源。下图是ResourceManager的三大功能

跟我一起学Hadoop YARN(一)

  • NodeManager,整个集群中可以有多个NodeManager,它启动之后会向ReosurceManager报告自己的资源情况。当ResourceManager把程序丢过来的时候它会为程序提供一个运行环境(Container)。

跟我一起学Hadoop YARN(一)

NodeManager并没有限制Container的实现是什么,它内置了两种实现——DefaultContainerExecutor是基于JVM的Container,NodeManager会为每个程序开辟吃一个新的进程;LinuxContainerExecutor基于CGroup实现的Container,NodeManager会利用Linux的CGroup为了每个应用提供运行环境。YARN出现的要比Docker早,所以它是直接使用的CGroup而没有采用Docker。幸运的是从Hadoop 2.6开始已经提供DockerContainerExecutor。举个生活中的例子,你现在是一名拥有百套固定资产的房东,本来期望的的生活是撩妹->收房租->撩妹,结果发现自己每天忙着帮房客找适合它的房子、安排房客入驻或者安排房客搬出之类的破事。撩妹什么的大事情根本没有精力去做,所以现在是时候做出改变了!!我们可以把你的百套固定资产看成资源池,你是资源拥有者(ReosurceManager),房客(Application)是申请资源的人,为了便于管理每个小区安排一个代理人(NodeManager)。你有一个小本本上面记录了每个小区入住了哪些人,有多少空房,这些信息都是代理人每天向你报告的。当房客找你租房的时候你只要看一眼小本本,然后把代理人(NodeManager)的联系方式给房客就行了。

YARN Application工作原理

YARN采用的是二级资源分配,它的工作过程要比上面的描述复杂的多。为了更加详细的解释YARN Application的工作原理我们来看一张官方的图


这幅图里面有两个Application,一个颜色是粉红色的一个是紫色,两个并没有什么区别,粉红色的占用资源比较多,紫色的比较少,我们关注紫色的。先看蓝色的线,NodeManager启动之后会向ResourceManager报告自己的资源分配情况再看黑色的虚线

  • Client(其实就是Application)会先向ResourceManager申请提交应用(SubmitApplication),ResourceManager会返回集群中所有可用资源;Client申请一个Container用来运行ApplicationMaseter的部分,ResourceManager选择一份资源把任务下发到NodeManager(Client到ResourceManager的虚线)

  • NodeManager会启动一个Container来执行ApplicationMaster(图中对应紫色App Mstr)。

至此,一级资源分配完毕,接下来的工作是ApplicationMaster和ResourceManager交互完成剩余资源申请工作。

  • ApplicationMaster向ResourceManager申请资源用于执行实际计算任务。ResourceManager会根据情况返回可用的资源(所有的申请未必全部满足),ApplicationMaster也会根据实际情况决定是否使用申请到的资源。(图中紫色App Mstr到ResourceManager的黑色虚线)

  • ApplicaitonMaster申请到的资源依然交给NodeManager处理,它会启动Container用来执行计算任务。(图中紫色App Mastr到紫色Container的黑线)

总结下来其实就一句话——两级资源调度会先分配你一份计算资源,这份计算资源用来跑的程序会尝试申请更多份计算资源。两级资源调度可以提高系统资源利用率。系统的资源是动态变化的,每隔一段时间就要分配新的计算或者释放计算资源,一个Application的资源需求不可能被一次性满足,两级调度会先尝试分配一部分资源给Application以保证Application可以正常运行。接下来有新的资源会为Applicaiton追加新的资源。

分布式资源管理框架

看到网上有一些对比YARN和mesos的文章会说YARN是专门为M/R量身定制的或者说不支持两级调度。其实这些说法都不正确,YARN是一个纯粹的分布式资源管理框架它和M/R并没有任何直接关系。我们可以基于YARN开发自己的Application,比如Spark就是很好的例子。后面的文章我会尝试和大家一起开发一个真正的YARN Application,我们会发现Hadoop YARN带给我们的惊喜。

欢迎关注公众账号了解更多信息“写程序的康德——思考、批判、理性”





以上是关于跟我一起学Hadoop YARN的主要内容,如果未能解决你的问题,请参考以下文章

跟我一起学python

跟我一起学python

跟我一起学python-01

跟我一起学python-02

[转]跟我一起学extjs5(02--建立工程项目)

跟我一起学kafka