Hadoop核心组件之Yarn
程序在Yarn上的运行流程
如图所示,Yarn上的应用程序运行会经过如下步骤:
1.客户端提交应用程序
2.RM找到一个NM启动第一个container来运行AM
3.AM会向RM请求资源的分配并通过心跳机制来汇报作业的运行状态
4.AM在分配的NM上启动container来运行作业
Yarn和MRv.1的对比
MRv.1中由两个进程控制作业的执行:JobTracker和TaskTracker
JobTracker协调系统中运行的所有作业,并分配任务给TaskTracker
TaskTracker负责运行任务并发送执行报告给JobTracker
如果任务执行失败,JobTracker将会在另外一个TaskTracker上重新分配该任务
在MRv.1中,JobTracker管理着系统的资源调度、任务分配
在Yarn中,JobTracker被了另外两个角色所代替:ResourceManager和ApplicationMaster(每个作业单独一个)
下表列出了MRv.1和Yarn中的各个角色的对比
MRv.1 | Yarn |
---|---|
JobTracker | ResourceManager,ApplicationMaster,TimelineServer |
TaskTracker | NodeManager |
slot | container |
Yarn的设计突破了MRv.1中的众多限制,例如:
可扩展性
因为JobTracker集资源调度和任务分配两大核心功能于一身,是个相当重量级的组件
当集群规模变大的时候,JobTracker所在的节点负荷会变得很大,这也就限制了其集群规模只能为4000个节点或者调度40000个任务
而Yarn将JobTracker划分为系统级的ResourceManager和应用级的ApplicationMaster,角色细分,可以管理超过10000个节点和100000个任务的超大集群
高可用性
JobTracker存在单点故障问题,因为JobTracker本身功能的复杂性,所以很难做到HA
反之Yarn则不同,ResourceManager和ApplicationMaster都做到了高可用的机制
资源利用率
MRv.1中的资源是以slot形式来描述的,每个slot是一个固定大小的资源槽(在配置的时候就固定下来了)
并且还划分为map slot和reduce slot,分别只能运行map和reduce task
无法实现资源共享,并且每个task并不一定能够完全使用一个slot的资源,这就造成了资源浪费
Yarn中将资源描述为container,map和reduce task都使用同样概念的container,并且按需分配
多用户
从某个角度看,使用Yarn的最大好处就是可以将MapReduce和其他并行计算框架完美的结合起来
Yarn将资源调度和任务分配拆分开来,使得例如Spark、Storm等实时计算框架可以和MapReduce运行在同一集群上并进行统一的资源调度
而MRv.1则是专门为离线计算的MapReduce框架而生的
Container模型
当前Yarn支持内存和cpu两种资源类型的管理和分配,yarn采用了动态资源分配机制
NodeManager启动时会向ResourceManager注册,注册信息中包含该节点可分配的cpu和内存总量
- yarn.nodemanager.resource.memory-mb:可分配的物理内存总量,默认是8mb*1024,即8G
- yarn.nodemanager.vmem-pmem-ratio:任务使用单位物理内存量对应最多可使用的虚拟内存量,默认值是2.1,表示每1mb的物理内存,最多可以使用2.1mb虚拟内存总量
- yarn.nodemanager.resource.cpu-vcores:可分配的虚拟cpu个数,默认是8,yarn允许管理员根据实际需要和cpu性能将每个物理cpu划分成若干个虚拟cpu
Yarn中的调度器
Yarn支持三种调度器:FIFO,Capacity和Fair调度器
默认为FIFO
FIFO Scheduler
顾名思义,该调度器将作业按照提交的顺序排成一个队列,先进先出,先提交的先运行
这就带来一个问题:如果先运行了一个非常大的作业,该作业会占用集群的所有资源,而一些只需要一小部分资源就能完成的小作业将会等到大作业完成之后才能进行
所以该调度器不适合用于一个共享的、多用户的集群环境
Capacity Scheduler
其为FIFO的升级版,该调度器会将集群中的一小部分资源划分出来单独作为一个队列来运行小作业
虽然在处理大作业的同时也能够处理小作业,但是由于大作业的资源被占用了一部分(FIFO中其是独占整个集群资源的),所以大作业的执行时间会比FIFO的更久
大小作业队列内部采用FIFO的方式进行调度
配置方式
下面是一个简单的Capacity Scheduler的配置文件(在classpath中的capacity-scheduler.xml)
<?xml version="1.0"?> <configuration> <!--将root划分为两个列队--> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod,dev</value> </property> <!--dev再次划分为两个列队--> <property> <name>yarn.scheduler.capacity.root.dev.queues</name> <value>eng,science</value> </property> <!--root中两个队列的容量分别为40%和60%--> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>40</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>60</value> </property> <!--dev队列所能用的最大集群资源量--> <property> <name>yarn.scheduler.capacity.root.dev.maxinum-capacity</name> <value>75</value> </property> <!--dev中两个队列的容量都为50%--> <property> <name>yarn.scheduler.capacity.root.dev.eng.capacity</name> <value>50</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.science.capacity</name> <value>50</value> </property> </configuration>
该配置文件会产生如下所示的调度队列:
root
~ prod
~ dev ~ eng science
~
Fair Scheduler
公平调度器会根据运行的作业来动态分配资源
当集群中只有一个大作业在运行的时候,其会占用集群中的所有资源
当第二个作业(小作业)提交之后,将会划分集群中一般的资源来运行这个作业,这样集群中的各个作业得到的资源都是相同的
当小作业运行完毕之后,大作业会继续占用那一半的资源,所以称为公平调度器
这是在单用户多任务的情况下的资源分配,当出现多用户多任务的时候
每个用户都将得到集群中相同比例的资源数,每个用户中的每个作业将会得到相同比例的该用户所得资源数
配置方式
在yarn-site.xml中需要配置
yarn.resourcemanager.scheduler.class
为
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
(Hadoop中该选项默认为Capacity,而在CDH中默认为Fair)
下面是一个简单的Fair Scheduler的配置文件
(在classpath中的fair-scheduler.xml,可以通过yarn-site.xml中的yarn.scheduler.fair.allocation.file配置项修改)
<?xml version="1.0"?> <allocations> <!--设置各个队列中默认的调度器为fair--> <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy> <queue name="prod"> <weight>40</weight> <!--特殊指定该队列的调度器为fifo--> <schedulingPolicy>fifo</schedulingPolicy> </queue> <queue name="dev"> <weight>60</weight> <!--没有指定weight默认平分--> <<queue name="eng" /> <<queue name="sicence" /> </queue> <queuePlacementPolicy> <!--队列中没有specefied则进入下个rule--> <rule name="specefied" create="false" /> <!--队列中没有用户组则进入下个rule--> <rule name="primaryGroup" create="false" /> <!--默认进入dev.eng--> <rule name="default" create="dev.eng" /> </queuePlacementPolicy> </allocations>
上面的配置文件将会产生和之前Capacity配置的一样的队列
作者:@小黑

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ZooKeeper一二事 - 搭建ZooKeeper伪分布式及正式集群 提供集群服务
集群真是好好玩,最近一段时间天天搞集群,redis缓存服务集群啦,solr搜索服务集群啦,,,巴拉巴拉 今天说说zookeeper,之前搭建了一个redis集群,用了6台机子,有些朋友电脑跑步起来,有点卡,那这里主要说说伪分布式的集群,正式版的集群需要3台机子,我就一带而过说一说,搭建起来也是非常简单的 先来说说Zookeeper 什么是Zookeeper呢,顾名思义,动物园管理员嘛,什么hadoop大象啦,hive蜜蜂啦,pig小猪啦,都是用这货来管的,就是大数据Hadoop里面的嘛~ (题外话:知道孙越嘛,就是说相声捧哏那位,岳云鹏的搭档,哈哈哈,散养,说笑了) 主要用法 1、集群管理 提供主从的管理、负载均衡、实现高可用(HA)管理; 集群的代理层面,作为入口(redis集群搭建是不需要zk,就没有入口这一说法,redis-cli随便访问那个IP就行) Zookeeper必须是集群才能保证高可用Zookeeper有选举和投票的机制。集群中至少应该有三个节点。为啥是3个节点呢,如果有一台机子宕机了,机制是选取一半以上的,如果是两台,那么就不行了,所以至少3台 2、对文件进行集中管理...
- 下一篇
Cloudera编译好的各种hadoop,oozie等组件压缩包URL
由于Apache官方有些组件只提供源代码,需要我们编译,很不方便,而且往往还有兼容性问题!!!所以我们可以使用cloudera公司给我们编译好的组件(基本和Apache一样的)。优势大概分为两点:1.我们可以很好的对各个兼容版本有个把握2.不需要我们辛苦的编译了 常用下载包地址:http://archive.cloudera.com/cdh4/cdh/4/http://archive.cloudera.com/cdh5/cdh/5/ 案例: hadoop-2.3.0+zookeeper-3.4.5+oozie-4.0.0 http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.3.0-cdh5.1.0.tar.gz http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.1.0.tar.gz http://archive.cloudera.com/cdh5/cdh/5/oozie-4.0.0-cdh5.1.0.tar.gz
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群