Hadoop数据操作系统YARN全解析其它
为了能够对集群中的资源进行统一管理和调度,Hadoop 2.0引入了数据操作系统YARN。YARN的引入,大大提高了集群的资源利用率,并降低了集群管理成本。首先,YARN允许多个应用程序运行在一个集群中,并将资源按需分配给它们,这大大提高了资源利用率,其次,YARN允许各类短作业和长服务混合部署在一个集群中,并提供了容错、资源隔离及负载均衡等方面的支持,这大大简化了作业和服务的部署和管理成本。
YARN总体上采用master/slave架构,如图1所示,其中,master被称为ResourceManager,slave被称为 NodeManager,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的Container。由于不同的ApplicationMaster被分布到不同的节点上,并通过一定的隔离机制进行了资源隔离,因此它们之间不会相互影响。
图1 Apache YARN的基本架构
YARN中的资源管理和调度功能由资源调度器负责,它是Hadoop YARN中最核心的组件之一,是ResourceManager中的一个插拔式服务组件 。YARN通过层级化队列的方式组织和划分资源,并提供了多种多租户资源调度器,这种调度器允许管理员按照应用需求对用户或者应用程序分组,并为不同的分组分配不同的资源量,同时通过添加各种约束防止单个用户或者应用程序独占资源,进而能够满足各种QoS需求,典型代表是Yahoo!的Capacity Scheduler和Facebook的Fair Scheduler。
YARN作为一个通用数据操作系统,既可以运行像MapReduce、Spark这样的短作业,也可以部署像Web Server、mysql Server这种长服务,真正实现一个集群多用途,这样的集群,我们通常称为轻量级弹性计算平台,说它轻量级,是因为YARN采用了cgroups轻量级隔离方案,说它弹性,是因为YARN能根据各种计算框架或者应用的负载或者需求调整它们各自占用的资源,实现集群资源共享,资源弹性收缩。
图2 以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所示,我们根据机器配置和应用程序需求,为集群中的节点打上了多种标签,包括:
spark-node:用于运行spark作业的机器,这些机器通常配置较高,尤其是内存较大;
mr-node:运行MapReduce作业的机器,这些机器配置是多样的;
docker-node:运行docker应用程序的机器,这些机器上装有docker engine;
streaming-node:运行spark streaming流式应用的机器。
图3 YARN部署示例
需要注意的是,YARN允许一个节点同时存在多个标签,进而实现一台机器混合运行多类应用程序(在hulu内部,我们允许一些节点是共享的,同时可以运行多种应用程序)。表面上看来,通过引入标签将集群分成了多个物理集群,但实际上,这些物理集群跟传统意义上完全隔离的集群是不同的,这些集群既相互独立又相互关联,用户可非常容易地通过修改标签动态调整某个节点的用途。
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仓库完成一整套开发、测试、自动发布的流程。
图4 Voidbox系统架构
在Voidbox中,YARN负责集群的资源调度,Docker作为一个执行引擎,从Docker Registry中拉取镜像执行。Voidbox负责为基于容器的DAG任务申请资源,运行Docker任务。如图4所示,每个黑线框代表一台机器,上面运行着几个模块,具体如下:
Voidbox组件:
VoidboxClient:客户端程序。用户可通过该组件管理Voidbox应用程序(Voidbox应用程序包含一个或多个Docker作业,一个作业包含一个或多个Docker任务),比如提交和杀死Voidbox应用程序等。
VoidboxMaster:实际上是一个YARN的Application Master,负责向YARN申请资源,并将得到的资源进一步分配给内部的Docker任务。
VoidboxDriver:负责单个Voidbox应用程序的任务调度。Voidbox支持基于Docker Container的DAG任务调度并且在任务之间可以插入其他用户代码,Voidbox Driver负责处理DAG任务之间的依赖顺序调度以及运行用户代码。
VoidboxProxy:是YARN与Docker引擎之间的桥梁,负责中转YARN发向Docker引擎的命令,比如启动或杀死Docker容器等。
StateServer:维护各个Docker引擎的健康状况信息,向Voidbox Master提供可运行Docker Container的机器列表,使得Voidbox Master可以更有效地申请资源。
Docker组件:
DockerRegistry:存储Docker镜像,作为内部Docker镜像的版本管理工具。
DockerEngine: Docker Container执行的引擎,从Docker Registry获取相应的Docker镜像,执行Docker相关命令。
Jenkins:配合GitLab进行应用程序的版本管理,当应用版本更新时,Jenkins负责编译打包,生成Docker镜像,上传至Docker Registry,从而完成应用程序自动发布的流程。
类似于spark on yarn,Voidbox也提供两种应用程序运行模式,分别是yarn-cluster模式和yarn-client模式。yarn-cluster模式中应用程序的控制组件和资源管理组件都运行在集群中,Voidbox应用程序提交成功后,客户端可以随时退出而不影响集群中应用程序的运行。yarn- cluster模式适合生产环境提交应用程序;yarn-client模式中应用程序的控制组件运行在客户端,其他组件运行在集群中,客户端可以看到关于应用程序运行状态的更多信息,客户端退出后,在集群中运行的应用程序也随即退出,yarn-client模式可以方便用户进行调试。
(2)并行计算引擎nesto
nesto是hulu内部一个类似于presto/impala的MPP计算引擎,它是专门为处理复杂的嵌套式数据而设计的,支持复杂的数据处理逻辑(SQL难以表达),其采用了列式存储、code generation等优化技术以加速数据处理效率。Nesto架构类似于presto/impala,它是无中心化的,多个nesto server通过zookeeper进行服务发现。
为了简化nesto部署和管理成本,hulu直接将nesto部署到YARN上。这样,nesto安装部署过程将变得非常简单:Nesto安装程序 (包括配置文件和jar包)被打成一个独立的压缩包存放到HDFS,用户可通过运行一个提交命令,并指定启动的nesto server数目、每个server需要的资源等信息,即可快速部署一套nesto集群。
Nesto on yarn程序由一个ApplicationMaster和多个Executor构成,其中ApplicationMaster负责像YARN申请资源,并启动Executor,而Executor的作用是启动nesto server,关键设计点在ApplicationMaster,它的功能包括:
与ResourceManager通信,申请资源,这些资源需保证来自不同的结点,以达到每个节点只启动一个Executor的目的;
与NodeManager通信,启动Executor,并监控这些Executor健康状况,一旦发现某个Executor出现故障,则重新在其他节点上启动一个新的Executor;
提供一个嵌入式web server,以便展示各个nesto server中任务运行状况。
2.Hadoop YARN开发经验总结
(1)巧用资源申请API
Hadoop YARN提供了较为丰富的资源表达语义,用户可以申请特定节点/机架上的资源,也可以通过黑名单的方式不再接受某个节点上的资源。
(2)注意memory overhead
一个container的内存是由java heap,jvm overhead和non-java memory三部分构成的,如果用户为应用程序设置的内存大小为X GB(-xmxXg),则ApplicationMaster为其申请的container内存大小应为X+D,其中D为jvm overhead,否则可能会因总内存超出限制被YARN杀死。
(3) log rotation
对于长服务而言,服务日志会越积攒越多,因而log rotation显得尤为重要。由于启动之前,应用程序是无法知道日志具体存放位置(比如哪个节点的哪个目录下)的,为了方便用户操作日志目录,YARN 提供了宏,当该宏出现在启动命令中时,YARN会自动将其替换为具体的日志目录,比如:
echo $log4jcontent > $PWD/log4j.properties && java -Dlog4j.configuration=log4j.properties …
com.example.NestoServer 1>>/server.log 2>>/server.log
其中变量log4jcontent内容如下:
(4)调试技巧
NodeManager启动Container之前,会将该Container相关的环境变量、启动命令等信息写入一个shell脚本,并通过启动该脚本的方式启动Container。有些情况下,Container启动失败可能是由于启动命令写错的缘故(比如某些特殊字符被转义了),为此,可通过查看最后执行脚本内容判断启动命令是否存在问题,具体方法是,在container执行命令之前添加打印脚本内容的命令。
(5)共享集群带来的性能问题
当在YARN集群中同时运行多种应用程序时,可能造成节点负载不一,进而导致某些节点上的任务运行速度慢于其他节点,这对于OLAP需求的应用是不能接受的。为了解决该问题,通常有两种解决方式:1)通过打标签的方式将这类应用运行到一些独享的节点上 2)在应用程序内部实现类似于MapReduce和Spark的推测执行机制,为慢任务额外启动一个或多个同样的任务,以空间换时间的方式,避免慢任务拖慢整个应用程序的运行效率。
Hadoop YARN发展趋势
对于 YARN,会朝着通用资源管理和调度方向发展,而不仅仅限于大数据处理领域,包括对 MapReduce、Spark 短作业的支持,以及对 Web Service 等长服务的支持。
数据分析咨询请扫描二维码
在准备数据分析师面试时,掌握高频考题及其解答是应对面试的关键。为了帮助大家轻松上岸,以下是10个高频考题及其详细解析,外加 ...
2024-12-20互联网数据分析师是一个热门且综合性的职业,他们通过数据挖掘和分析,为企业的业务决策和运营优化提供强有力的支持。尤其在如今 ...
2024-12-20在现代商业环境中,数据分析师是不可或缺的角色。他们的工作不仅仅是对数据进行深入分析,更是协助企业从复杂的数据信息中提炼出 ...
2024-12-20随着大数据时代的到来,数据驱动的决策方式开始受到越来越多企业的青睐。近年来,数据分析在人力资源管理中正在扮演着至关重要的 ...
2024-12-20在数据分析的世界里,表面上的技术操作只是“入门票”,而真正的高手则需要打破一些“看不见的墙”。这些“隐形天花板”限制了数 ...
2024-12-19在数据分析领域,尽管行业前景广阔、岗位需求旺盛,但实际的工作难度却远超很多人的想象。很多新手初入数据分析岗位时,常常被各 ...
2024-12-19入门数据分析,许多人都会感到“难”,但这“难”究竟难在哪儿?对于新手而言,往往不是技术不行,而是思维方式、业务理解和实践 ...
2024-12-19在如今的行业动荡背景下,数据分析师的职业前景虽然面临一些挑战,但也充满了许多新的机会。随着技术的不断发展和多领域需求的提 ...
2024-12-19在信息爆炸的时代,数据分析师如同探险家,在浩瀚的数据海洋中寻觅有价值的宝藏。这不仅需要技术上的过硬实力,还需要一种艺术家 ...
2024-12-19在当今信息化社会,大数据已成为各行各业不可或缺的宝贵资源。大数据专业应运而生,旨在培养具备扎实理论基础和实践能力,能够应 ...
2024-12-19阿里P8、P9失业都找不到工作?是我们孤陋寡闻还是世界真的已经“癫”成这样了? 案例一:本硕都是 985,所学的专业也是当红专业 ...
2024-12-19CDA持证人Louis CDA持证人基本情况 我大学是在一个二线城市的一所普通二本院校读的,专业是旅游管理,非计算机非统计学。毕业之 ...
2024-12-18最近,知乎上有个很火的话题:“一个人为何会陷入社会底层”? 有人说,这个世界上只有一个分水岭,就是“羊水”;还有人说,一 ...
2024-12-18在这个数据驱动的时代,数据分析师的技能需求快速增长。掌握适当的编程语言不仅能增强分析能力,还能帮助分析师从海量数据中提取 ...
2024-12-17在当今信息爆炸的时代,数据分析已经成为许多行业中不可或缺的一部分。想要在这个领域脱颖而出,除了热情和毅力外,你还需要掌握 ...
2024-12-17数据分析,是一项通过科学方法处理数据以获取洞察并支持决策的艺术。无论是在商业环境中提升业绩,还是在科研领域推动创新,数据 ...
2024-12-17在数据分析领域,图表是我们表达数据故事的重要工具。它们不仅让数据变得更加直观,也帮助我们更好地理解数据中的趋势和模式。相 ...
2024-12-16在当今社会,我们身处着一个飞速发展、变化迅猛的时代。不同行业在科技进步、市场需求和政策支持的推动下蓬勃发展,呈现出令人瞩 ...
2024-12-16在现代商业世界中,数据分析师扮演着至关重要的角色。他们通过解析海量数据,为企业战略决策提供有力支持。要有效完成这项任务, ...
2024-12-16在当今数据爆炸的时代,数据分析师是组织中不可或缺的导航者。他们通过从大量数据中提取可操作的洞察力,帮助企业在竞争激烈的市 ...
2024-12-16