目录
YARN安装和启动
YARN任务调度器分类
容量调度器的设计思想
容量调度器的特点
容量调度器的配置
容器调度器指定队列执行
Yet Another Resource Negotiator简称YARN,另一种资源协调者,是Hadoop的资源管理器。在Hadoop1.0版本之前是通过MR里面的JobTracker来进行任务的分发,之后Hadoop逐渐划分出YARN模块来管理任务的调度,在Hadoop 2.x版本之后YARN独立成了Apache的顶级项目。今天,主要是讲解YARN的任务调度器,关于YARN的安装和启动本文将在第一章节做下简单介绍,如果自己使用中遇到阻塞进行不下去了欢迎留言,我会及时解答。
YARN安装和启动
在Hadoop的安装目录的/etc/hadoop下配置mapred-site.xml 和 yarn-site.xml。通过/sbin下的start-all.sh启动Hadoop所有组件。启动后执行jps命令查看进程:
这里面两个进程和YARN相关:ResourceManager和NodeManager,再看看官网的架构图,就能很快对应上这两个进程分别做什么事。
图1
生产环境上可以只在NameNode的机器上启动ResourceManager,在DataNode的机器上启动NodeManager,这样所有客户端提交的任务通过ResourceManager进行分发给不同的NodeManager执行。
YARN任务调度器分类
- FIFO Scheduler(先进先出调度器)
先进先出调度器顾名思义就是哪个任务先来就执行哪个任务,这个调度器实现起来很简单,但是在集群环境,大规模应用下,有的任务可能占用的资源非常大,会导致一段时间调度器被一个任务占用,其他任务得不到执行。
- Capacity Scheduler(容量调度器)
这是YARN默认的调度器,也是我们今天要重点讲的调度器,容量调度器的优点就是能让多个任务并行执行,高效利用服务器资源。
- Fair Scheduler(公平调度器)
使用公平调度器,不需要预留资源,会自动在所有作业提交后动态分配资源,保证每个作业公平分享资源。
容量调度器的设计思想
容量调度器的设计思想是在集群环境中确保每个应用根据它们的计算需求分配资源。容量调度器提供了一系列严格的限制确保应用不能消费不成比例的资源。容量调度器通过用户权限或者队列来保证应用公平稳定的使用集群环境。容量调度器主要是通过对队列的抽象来保证客户端请求能经济高效的使用集群环境。容量调度器是使用分级队列(Hierarchical Queue)来保证客户端请求能共享空闲资源。
容量调度器的特点
- 分级队列(Hierarchical Queues)
分级队列允许用户定义子队列,Yarn在调度资源执行任务的时候会根据任务预计资源的大小分配到不同的队列执行,也可以直接指定任务在某个队列上执行。
- 容量保证(Capacity Guarantees)
队列分配的容量是通知配置文件里面的参数配置的,因此可以精确控制不同队列拥有的资源。
- 绝对大小资源配置(Absolute Resource Configuration)
这种方式可以允许用户给队列配置资源绝对大小,默认是百分比大小。
- 动态自动创建和管理队列(Dynamic Auto-Creation and Management of Leaf Queues)
此特性支持与队列映射一起自动创建叶子队列,当前支持基于用户组的队列映射,以便将应用程序放置到队列。 调度程序还支持基于父队列上配置的策略对这些队列进行容量管理。
容量调度器的配置
打开etc/hadoop/capacity-scheduler.xml,可以看到默认配置的是容量调度器:
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.capacity.CapacityScheduler</value>
</property>
继续往下看这个配置文件,容量调度器默认有一个根队列,所有队列都是根队列的子队列,配置文件默认配置了一个default的子队列。
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
通过YARN执行某个应用,会默认在default队列上执行。执行/share/hadoop/mapreduce 下的hadoop-mapreduce-examples-3.2.2.jar例子。执行命令:
yarn jar hadoop-mapreduce-examples-3.2.2.jar wordcount /input/data.txt /output/0009
在Web UI上查看结果:
从任务执行的结果上看到,任务的名称叫word count,队列使用的是default,执行的状态是完成和成功。
容器调度器指定队列执行
修改capacity-scheduler.xml文件,增加book和food两个子队列。
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,book,food</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
设置某个子队列的容量,某一层级的子队列的容量加起来不能超过100。
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>20</value>
<description>Default queue target capacity.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.book.capacity</name>
<value>30</value>
<description>Default queue target capacity.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.food.capacity</name>
<value>50</value>
<description>Default queue target capacity.</description>
</property>
依然是执行hadoop-mapreduce-examples-3.2.2.jar例子,例如指定在队列food上面执行。
yarn jar hadoop-mapreduce-examples-3.2.2.jar wordcount -Dmapreduce.job.queuename="food" /input/data.txt /output/0005
今天主要简要介绍了YARN的调度器分类和实现思想,着重讲解了容量调度器,该调度器的资源使用率最高,因此在生产上广泛使用。