0%

Yarn

Yarn

Yarn(Yet Another Resource Negotiator)是Hadoop的资源调度部分,作用主要是进行资源调度,相当于一个分布式的操作系统平台,MapReduce相当于运行在操作系统的应用程序,所以内部存在了一个ResourceManager(RM)来进行资源的管理

结构

yarn结构

ResourceManager(RM)

是一个全局的资源管理器,负责整个系统的资源管理和分配。主要是用来进行处理客户端请求、监控NodeManager、启动或监控ApplicationMaster、进行全局的资源分配与任务调度

资源管理
  • Container是资源的抽象,每个Container可以根据需要运行ApplicationMaster、Map、Reduce或者人以程序
  • Container是资源申请的单位,一个资源申请格式为:<resource-name,prority,resource-requirement,number-of-containers> resource-name是主机名、机架名,resource-requirement是CPU和内存
任务调度器

任务调度只关注资源的使用情况,根据需求合理分配资源,接收来自ApplicationMaster的应用程序资源请求,把集群中的资源以容器的形式分配给提出申请的应用程序。

在yarn-site.xml中

1
2
3
4
5
<!-- 资源调度器配置 有三种FIFO、CapacityScheduler和FairScheduler 默认CapacityScheduler-->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
FIFO调度器(先进先出调度器)

将应用放置在一个队列中,按照到达时间排序,先到先服务。

其不适合共享集群,大的应用会占用集群中的所有资源,所以每个应用必须等待直到轮到自己运行。共享集群更适合容量调度器或公平调度器

CapacityScheduler调度器(容量调度器))

按照到达时间排序,先到先服务

  • 支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,这样可以为小作业单独分配调度
  • 为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定
  • 计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列——最闲的
  • 按照作业优先级和提交时间顺序,同时考虑用户资源量限制和内存限制对队列内任务排序

配置文件名为capacity-scheduler.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!-- yarn.scheduler.capacity.<queue-path>.<sub-property> 进行设置
queue-path表示队列的层次路径,用.隔开
-->
<configuration>

<property>
<name>yarn.scheduler.capacity.maximum-applications</name>
<value>100</value>
<description>
Maximum number of applications that can be pending and running.
</description>
</property>

<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.1</value>
<description>
Maximum percent of resources in the cluster which can be used to run
application masters i.e. controls number of concurrent running
applications.
</description>
</property>


<!-- 在root下定义两个队列 daily,dev 分别占80和20-->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>daily,dev</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.daily.capacity</name>
<value>80</value>
<description>daily queue target capacity.</description>
</property>


<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>20</value>
<description>dev queue target capacity.</description>
</property>

<!-- daily最大到90%,即使dev队列空闲,daily也不会占用全部资源 -->
<property>
<name>yarn.scheduler.capacity.root.daily.maximum-capacity</name>
<value>90</value>
<description>
The maximum capacity of the daily queue.
</description>
</property>

</configuration>
FairScheduler(公平调度器)

按照缺额排序,缺额大者优先,会在所有运行的作业之间动态平衡资源。

支持多队列多用户,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源,每个队列中的job按照优先级分配资源,优先级越高分配的资源越多

在资源有限的情况下,每个job理想情况下获得的计算资源与实际获得的计算资源存在一种差距,这个差距就叫做缺额,在同一个队列中,job的资源缺额越大,越先获得资源优先执行

配置文件位置yarn.scheduler.fair.allocation.file来修改文件名,默认是在fair-scheduler.xml中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0"?>
<allocations>

<!-- 默认策略是公平策略,如果没有设置队列自己的策略,则使用默认策略 -->
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>

<!-- 定义两个队列 设置权重,会按照权重来进行分配资源-->
<queue name="daily">
<weight>80</weight>
<schedulingPolicy>fifo</schedulingPolicy>

<!-- 两个子队列 -->
<queue name="sample_sub_queue1"/>

<queue name="sample_sub_queue2"/>
</queue>


<queue name="dev" >
<weight>20</weight>
</queue>


<!-- 规则列表,如果规则不匹配则尝试下一条规则 -->
<queuePlacementPolicy>
<!-- specified 把应用放到所指明的队列中,如果没有指明或队列不存在,则规则不匹配 -->
<rule name="specified" />
<!-- primaryGroup 把应用放到以用户的主Unix组名命名的队列中,如果没有这样的队列,则规则不匹配 -->
<rule name="primaryGroup" create="false" />
<!-- default 兜底规则,上面的都不匹配,则使用该规则,把应用放进daily.sample_sub_queue1 -->
<rule name="default" queue="daily.sample_sub_queue1"/>
</queuePlacementPolicy>
</allocations>

NodeManager(NM)

管理节点,主要作用是管理单个节点上的资源、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令

  • 启动时向ResourceManager注册并定时发心跳消息,等待ResourceManager的指令
  • 监控Container的运行,维护Container的生命周期,监控Container的资源使用情况
  • 启动或停止Container,管理任务运行时的依赖包(根据ApplicationMaster的需要,启动Container之前将需要的程序包及其依赖包,配置文件等拷贝到本地)

ApplicationMaster(AM)

管理Job,主要作用是负责单个作业的资源管理和任务监控,数据的切分、为应用程序申请资源并分配给内部的任务、任务的监控与容错

  • 计算应用的资源需求,资源是可以静态或动态计算的,静态一般是Client申请时就指定了,动态则需要ApplicationMaster根据应用的运行状态来决定
  • 根据数据来申请对应位置的资源
  • 向ResourceManager申请资源,与NodeManager交互进行程序的运行和监控,监控申请的资源的使用情况,监控作业进度
  • 跟踪任务状态和进度,定时向ResourceManager发送心跳消息,报告资源的使用情况和应用的进度信息
  • 负责本作业内的任务的容错

Container

是Yarn中资源抽象,资源申请的单位和任务运行的容器,封装了某个节点上的多维度资源,如内存、CPU/磁盘、网络等。容器用于执行特定应用程序的进程

Hadoop1.x和Hadoop2.x区别

hadoop1和hadoop2区别

Hadoop1.x是没有yarn的,只有一个JobTracker,同时负责作业调度和任务进度监控,存在单点问题以及资源利用率不佳

欢迎关注我的其它发布渠道