上海宝付Hadoop数据操作系统YARN全解析

Hadoop YARN的生态系统

为了能够对集群中的资源进行统一管理和调度,Hadoop 2.0引入了数据操作系统YARN。YARN的引入,大大提高了集群的资源利用率,并降低了集群管理成本。首先,YARN允许多个应用程序运行在一个集群中,并将资源按需分配给它们,这大大提高了资源利用率,其次,YARN允许各类短作业和长服务混合部署在一个集群中,并提供了容错、资源隔离及负载均衡等方面的支持,这大大简化了作业和服务的部署和管理成本。

YARN总体上采用master/slave架构,如图1所示,其中,master被称为ResourceManager,slave被称为NodeManager,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的Container。由于不同的ApplicationMaster被分布到不同的节点上,并通过一定的隔离机制进行了资源隔离,因此它们之间不会相互影响。

YARN中的资源管理和调度功能由资源调度器负责,它是Hadoop YARN中最核心的组件之一,是ResourceManager中的一个插拔式服务组件 。YARN通过层级化队列的方式组织和划分资源,并提供了多种多租户资源调度器,这种调度器允许管理员按照应用需求对用户或者应用程序分组,并为不同的分组分配不同的资源量,同时通过添加各种约束防止单个用户或者应用程序独占资源,进而能够满足各种QoS需求,典型代表是Yahoo!的Capacity Scheduler和Facebook的Fair Scheduler。

YARN作为一个通用数据操作系统,既可以运行像MapReduce、Spark这样的短作业,也可以部署像Web Server、MySQL Server这种长服务,真正实现一个集群多用途,这样的集群,我们通常称为轻量级弹性计算平台,说它轻量级,是因为YARN采用了cgroups轻量级隔离方案,说它弹性,是因为YARN能根据各种计算框架或者应用的负载或者需求调整它们各自占用的资源,实现集群资源共享,资源弹性收缩。

Hadoop YARN在异构集群中的应用

从2.6.0版本开始,YARN引入了一种新的调度策略:基于标签的调度机制。该机制的主要引入动机是更好地让YARN运行在异构集群中,进而更好地管理和调度混合类型的应用程序。

1

什么是基于标签的调度

故名思议,基于标签的调度是一种调度策略,就像基于优先级的调度一样,是调度器中众多调度策略中的一种,可以跟其他调度策略混合使用。该策略的基本思想是:用户可为每个NodeManager打上标签,比如highmem,highdisk等,以作为NodeManager的基本属性;同时,用户可以为调度器中的队列设置若干标签,以限制该队列只能占用包含对应标签的节点资源,这样,提交到某个队列中的作业,只能运行在特定一些节点上。通过打标签,用户可将Hadoop分成若干个子集群,进而使得用户可将应用程序运行到符合某种特征的节点上,比如可将内存密集型的应用程序(比如Spark)运行到大内存节点上。

2

Hulu应用案例

基于标签的调度策略在Hulu内部有广泛的应用。之所以启用该机制,主要出于以下三点考虑:

集群是异构的。在Hadoop集群演化过程中,后来新增机器的配置通常比旧机器好,这使得集群最终变为一个异构的集群。Hadoop设计之初众多设计机制假定集群是同构的,即使发展到现在,Hadoop对异构集群的支持仍然很不完善,比如MapReduce推测执行机制尚未考虑异构集群情形。

应用是多样化的。Hulu在YARN集群之上同时部署了MapReduce、Spark、Spark Streaming、Docker Service等多种类型的应用程序 。当在异构集群混合运行多类应用程序时,经常发生由于机器配置不一导致并行化任务完成时间相差较大的情况,这非常不利于分布式程序的高效执行。此外,由于YARN无法进行完全的资源隔离,多个应用程序混合运行在一个节点上容易相互干扰,对于低延迟类型的应用通常是难以容忍的。

个性化机器需求。由于对特殊环境的依赖,有些应用程序只能运行在大集群中的特定节点上。典型的代表是spark和docker,spark MLLib可能用到一些native库,为了防止污染系统,这些库通常只会安装在若干节点上;docker container的运行依赖于docker engine,为了简化运维成本,我们 只会让docker运行在若干指定的节点上。

为了解决以上问题,Hulu在Capacity Scheduler基础上启用了基于标签的调度策略。如图3所示,我们根据机器配置和应用程序需求,为集群中的节点打上了多种标签,包括:

q spark-node:用于运行spark作业的机器,这些机器通常配置较高,尤其是内存较大;

q mr-node:运行MapReduce作业的机器,这些机器配置是多样的;

q docker-node:运行docker应用程序的机器,这些机器上装有docker engine;

q streaming-node:运行spark streaming流式应用的机器。

需要注意的是,YARN允许一个节点同时存在多个标签,进而实现一台机器混合运行多类应用程序(在hulu内部,我们允许一些节点是共享的,同时可以运行多种应用程序)。表面上看来,通过引入标签将集群分成了多个物理集群,但实际上,这些物理集群跟传统意义上完全隔离的集群是不同的,这些集群既相互独立又相互关联,用户可非常容易地通过修改标签动态调整某个节点的用途。

Hadoop YARN应用案例及经验总结

1

Hadoop YARN应用案例

Hadoop YARN作为一个数据操作系统,提供了丰富的API供用户开发应用程序。Hulu在YARN应用程序设计方面进行了大量探索和实践,开发了多个可直接运行在YARN上的分布式计算框架和计算引擎,典型的代表是voidbox和nesto。

(1)基于Docker的容器计算框架 voidbox

Docker是近两年非常流行的容器虚拟化技术,可以自动化打包部署绝大部分应用,它使得任何程序能够运行在资源隔离的容器环境,从而提供了一套更加优雅的项目构建、发布、运行的解决方案。

为了整合YARN和Docker各自的独特优势,Hulu北京大数据团队开发了Voidbox。Voidbox是一个分布式的计算框架,利用YARN作为资源管理模块,用Docker作为执行任务的引擎,从而让YARN既可以调度传统的MapReduce和Spark等类型的应用程序,也可以调度封装在Docker镜像中的应用程序。

Voidbox支持基于Docker Container的DAG(有向无环图)任务和长服务(比如web service),提供命令行方式与IDE方式等多种应用程序提交方式,满足了生产环境和开发环境的需求。此外,Voidbox可以配合Jenkins,GitLab,私有的Docker仓库完成一整套开发、测试、自动发布的流程。

猜你喜欢

转载自blog.51cto.com/14805651/2495528