大数据学习之路(18):Hadoop的yarn资源调度器介绍

246 阅读2分钟

一、Yarn基本架构

yarn是一个资源调度器,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于操作系统上的应用程序。

主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件。

clipboard.png

1)ResourceManager作用:

    1. 处理客户端请求
    1. 监控NodeManager
    1. 启动或监控ApplicationMaster
    1. 资源的分配与调度

2)NodeManager作用:

  • 1.管理单个节点上的资源
  • 2.处理来自ResourceManager的命令
  • 3.处理来自ApplicationMaster的命令
  1. ApplicationMaster作用:
    1. 负责数据的切分
    1. 为应用程序申请资源并分配给内部的任务
    1. 任务的监控与容错

4)Container

  • 1.container是yarn的资源抽象,封装了某个节点上的多种资源。例如:内存、cpu、磁盘、网络等

二、yarn工作机制

image.png

三、资源调度器

Hadoop作业调度器主要有三种:FIFO、Capacity、Fair

image.png

具体的设置配置在yarn-default.xml文件。 image.png

FIFO(单队列)

  • 所有的作业被统一提交到一个队列中,Hadoop按照提交顺序依次运行这些作业。
  • 缺点:对不同作业的多样化需求不能满足,也不能充分利用硬件资源。

Capacity(多队列)

  • 用多队列执行,每个队列设置资源占比。
  • 可以对同一个用户提交的作业所占资源量限定
  • 当一个队列的资源有剩余的时候,可暂时将剩余的资源共享给其他队列。

Fari(多队列)

  • 同队列都能平均的获取等同的贡献资源,即如果两个任务,则每个50%,如果四个任务,每个25%。
  • 多队列执行,每个队列设置资源占比

四、容器调度器多队列提交案例

4.1 需求

Yarn默认的容量调度器是一条单队列的调度器,在实际使用中会出现单个任务阻塞整个队列的情况,同时,随着业务的增长,公司需要分业务限制集群使用率。这就需要我们按照业务种类配置多余的队列。

image.png

4.2 配置多队列的容量调度器

默认的Yarn的配置下,容器调度器只有一条Default队列。在capacity-scheduler.xml 中可以配置多条队列。并降低default队列资源占比。

<!-- 指定多队列 -->
<property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,hive</value>
 </property>
<!-- 指定default队列的额定容量 -->
<property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>40</value>
</property>
<!-- 指定hive队列的额定容量 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.capacity</name>
    <value>60</value>
</property>
<!-- 指定default队列允许单用户占用的资源占比 -->
<property>
    <name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
    <value>1</value>
</property>
<!-- 指定hive队列允许单用户占用的资源占比 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
    <value>1</value>
</property>
<!-- 指定default队列的最大容量-->
<property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>60</value>
</property>
<!-- 指定hive队列的最大容量-->
<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
    <value>80</value>
</property>
<!-- 指定default队列的状态 -->
<property>
    <name>yarn.scheduler.capacity.root.default.state</name>
    <value>RUNNING</value>
</property>
<!-- 指定hive队列的状态 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.state</name>
    <value>RUNNING</value>
</property>
<!-- 指定default队列允许哪些用户提交job-->
<property>
    <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    <value>*</value>
</property>
<!-- 指定hive队列允许哪些用户提交job-->
<property>
    <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
    <value>*</value>
</property>
<!-- 指定default队列允许哪些用户进行管理-->
<property>
    <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    <value>*</value>
</property>
<!-- 指定hive队列允许哪些用户进行管理-->
<property>
    <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
    <value>*</value>
</property>
<!-- 指定default队列允许哪些用户提交配置优先级的job-->
<property>       <name>yarn.scheduler.capacity.root.default.acl_application_max_priority</name>
    <value>*</value>
</property>
<!--指定hive队列允许哪些用户提交配置优先级的job -->
 
<property>
  <name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
    <value>*</value>
</property>
<!-- 指定default队列允许job运行的最大时间-->
<property>
     <name>yarn.scheduler.capacity.root.default.maximum-application-lifetime
     </name>
     <value>-1</value>
 </property>
<!-- 指定hive队列允许job运行的最大时间-->
 <property>
     <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime
     </name>
     <value>-1</value>
 </property>
<!-- 指定default队列允许job运行的默认时间-->
 <property>
     <name>yarn.scheduler.capacity.root.default.default-application-lifetime
     </name>
     <value>-1</value>  
</property>
<!-- 指定hive队列允许job运行的最大时间-->
<property>
     <name>yarn.scheduler.capacity.root.hive.default-application-lifetime
     </name>
     <value>-1</value>
</property>

image.png

还可以让job提交到指定队列:(在driver中添加)

 configuration.set("mapred.job.queue.name", "hive");