资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.什么是资源隔离
资源隔离是指为不同任务提供可独立使用的计算资源以避免它们互相干扰。当前存在很多资源隔离技术,比如硬件虚拟化,虚拟化,Cgroups,Linux Container等。
YARN对内存资源和CPU资源采用了不同对资源隔离方案。对于内存资源,它是一种限制性资源,它的量的大小直接决定的应用程序的死活,为了能够更灵活地控制内存使用量,YARN提供了两种可选方案:线程监控方案和基于轻量级资源隔离技术Cgroups的方案。
默认情况下,YARN采用了进程监控的方案控制内存使用,即每个NodeManager会启动一个额外的监控线程监控每个Container的内存资源使用量,一旦发现它超过约定的资源量,则会将其杀死。采用这种机制的另一个原因是Java中创建子进程采用了“fork()+exec()”的方案,子进程启动瞬间,它使用的内存量和父进程一致,从外面开来,一个进程使用内存量可能瞬间翻倍,然后有降下来,采用线程监控的方案可防止这种情况下导致swap操作;
另一种可选的方案则基于轻量级资源隔离技术Cgroups,Cgroups是Linux内核提供的弹性资源隔离机制,可以严格限制内存使用上限,一旦进程使用的资源量超过预先定义的上限值,则可见其杀死。对于CPU资源,它是一种弹性资源,它的大小不会直接影响应用程序的死活,因此采用了Cgroups。
博主推荐阅读:Cgroup(https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/resource_management_guide/chap-introduction_to_control_groups#sec-What_are_Control_Groups。)
博主推荐阅读:Linux Container(https://linuxcontainers.org/)
博主推荐阅读:基于轻量级Cgroups的方案(https://issues.apache.org/jira/browse/YARN-3)
博主推荐阅读:https://issues.apache.org/jira/secure/attachment/12536900/MAPREDUCE-4334-v2.patch
博主推荐阅读:https://issues.apache.org/jira/browse/YARN-2.
二.CPU隔离机制
相比于线程监控,Cgroup是一种更加严格和有效的资源限制方法,相比于虚拟机(Virtual Machice,VM),Cgroup是一种轻量级资源隔离方案,且已被越来越广泛的使用。YARN采用了Cgroups对CPU资源进行隔离。
YARN引入了“虚拟CPU”这一术语,它是由物理CPU映射产生的,比如一个物理CPU代表4个虚拟CPU,一台机器可用CPU个数是8,则改值可配成32。YARN不让管理员和用户配置可用物理CPU个数,而是直接配置虚拟CPU个数。虚拟CPU的引入,带来了很多好处,包括:允许用户更细粒度的设置CPU资源量,比如你想让自己的一个任务在最差的情况下使用CPU的50%,可在提交应用程序时设置CPU虚拟个数为2(假设物理CPU和虚拟机CPU映射关系是1:4);从一定成都上解决了CPU异构问题,可以根据物理CPU的性能高低为它们设置不同的虚拟机CPU个数。
默认情况下,NodeManager未启用任何CPU资源隔离机制,如果想启用该机制,需使用LinuxContainerExecutor,它能够以应用程序提交者的身份创建文件,运行Container和销毁Container,相比于DefaultContainerExecutor采用NodeManager启动者的身份执行这些操作,LinuxContainerExecutor的这种方式安全的多。
LinuxContainerExecutor的设计核心思想是,赋予NodeManager启动者以root权限,进而使用它拥有足够的权限以任意身份用户执行一些操作,从而使得NodeManager执行者可以将Container使用的目录和文件的拥有者修改为应用程序提交者,并以应用程序的提交者的身份允许Container,防止所有Container以NodeManager执行者身份运行带来的各种安全风险,比如防止用户在Container中执行一些只有NodeManager用户有权限执行的命令(杀死其他应用程序的命令,关闭,或者萨斯NodeManager进程等。)
三.DockerContainerExecutor
从2.6.0版本开始,YARN引入了一种新的ContainerExecutor:DockerContainerExecutor(DCE)。它的引入,使得NodeManager能够将YARN Container直接运行在Docker Container中。
Docker将易于使用的Linux容器界面与易于构建的容器图像文件相结合。简而言之,Docker推出了非常轻量级的虚拟机。
Docker Container Executor(DCE)允许YARN NodeManager将YARN容器启动到Docker容器中。用户可以为其YARN容器指定所需的Docker镜像。这些容器提供了一个定制的软件环境,用户的代码在该环境中运行,与NodeManager的软件环境隔离。这些容器可以包含应用程序所需的特殊库,它们可以具有与NodeManager上安装的不同版本的Perl,Python甚至Java。实际上,这些容器可以运行与NodeManager上运行的不同的Linux风格 - 虽然YARN容器必须定义运行作业所需的所有环境和库,但不会与NodeManager共享任何内容。
Docker for YARN提供一致性(所有YARN容器将具有相同的软件环境)和隔离(不干扰物理机器上安装的任何内容)。
详情请参考官方文档:http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/DockerContainerExecutor.html。
四.以YARN为核心的生态系统
YARN发展到今天,已经变成了一个数据操作系统(Data Operation System),很多应用程序或服务不在基于传统的操作系统(比如Linux)开发和部署,而是基于YARN这样的数据操作系统,这意味着,很多新的计算框架或者应用程序脱了YARN将不再能够单独运行,典型的代表是DAG计算框架Tez和Spark(Spark也可以运行在Mesos上)。
为了方便用户将应用程序或者运行到YARN上,Apache Slider和Twill两个项目诞生了,它们的主要定位如下:
(1)Apache Slider:
通过Apache Slider,用户可将现有服务,在不经过任何代码修改的情况下,直接部署到YARN。目前Apache Slider内置了对Storm和Hbase的支持。
官方网站:http://incubator.apache.org/projects/slider.html。
(2)Apache Twill:
提供了一套简化版编程模型,方便用户在YARN之上开发,部署和管理应用程序。
官网网站:http://twill.apache.org/.
总结起来,支持运行在YARN上的计算框架和服务主要有:
1>.MapReduce
MapReduce是一个非常经典的离线计算框架,在MRv1中,MapReduce应用程序需运行在由JobTracker和TaskTracker组成的运行时环境中,而在YARN中,不在有JobTracker和TaskTracker这样的服务组件,取而代之的是ApplicationMaster,它只负责应用程序相关的管理,比如任务切分和调度,任务监控和容错等,而资源相关的调度和管理交给YARN完成。
官方地址:http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html.
2>.Tez
HortonWorks开源的DAG计算框架,在MapReduce基础上扩展而来的,重用了MapReduce大量代码,仅支持运行在YARN上,不可单独运行,已被广泛应用于Hive,Pig等引擎中。
官方地址:https://tez.apache.org/
3>.Storm
流式实时计算框架,运行时环境由Nimbus和Supervisor等组件构组成,通过Apache Slider。可将Strom直接运行在YARN上。
官方地址:https://storm.apache.org/。
4>.Spark
Spark是一个通过DAG内存计算引擎,尤其适合数据挖掘,机器学习等方面的应用,相比于MapReduce框架,Spark更加高效易用。Spark设计之初,就考虑到如何与其他资源管理系统集成,因此可直接运行在YARN和Mesos等资源管理系统上。
官方地址:https://spark.apache.org/。
5>.HBase
构建在HDFS之上的数据库系统,运行时环境由HMaster和RegionServer等组件构成,通过Apache Slider,可将HBase直接运行在YARN上。
官方地址:https://hbase.apache.org/
6>.Giraph
开源图库算法库,最初版本是基于MRv1实现的,随着Hadoop 2.0的成熟,正是将所有图算法运行在YARN之上(不在基于MapReduce)。
相关链接:https://issues.apache.org/jira/browse/GIRAPH-13。
官方地址:http://giraph.apache.org/。
7>.OpenMPI
非常经典的高性能并行编程接口,目前正尝试将其运行在YARN上。
官方地址:https://www.open-mpi.org/。
最终,YARN之上可以运行各种应用类型的框架,包括离线计算框架MapReduce,实时计算框架Storm,DAG计算框架Tez等,真正实现一个集群多种用途,这样的集群,我们通常称为轻量级弹性计算平台,说它轻量级,是因为YARN采用了Cgroup轻量级隔离方案,说它弹性,是因为YARN能根据各种计算框架或者应用的负载和需求调整它们各自占用的资源,实现集群资源共享,资源弹性收缩。在不久的将来,普遍采用的部署方案应该如上图所示。
当然,随着YARN服务资源管理系统方向更好的发展,最终Web Server,MySQL Sever这种长服务,均可以部署在YARN之上,这样,YARN讲变为一个服务统一部署和管理平台,最终形成一个以YARN为核心的生态系统。