剑客
关注科技互联网

跟我一起学 Hadoop YARN

Hadoop 2.0的本质

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


跟我一起学 Hadoop YARN

上图是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的工作原理我们来看一张官方的图


跟我一起学 Hadoop YARN

这幅图里面有两个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

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址