ResourceManager

  1. //配置调度器,默认容量
  2. yarn.resourcemanager.scheduler.class
  3. //ResourceManager处理调度器请求的线程数量,默认50
  4. //举例:但是不能超过 3 * 4 线程 = 12 线程
  5. yarn.resourcemanager.scheduler.client.thread-count

NodeManager

  • 每个节点硬件不同的话,需要每节点单独配置 ```bash //是否让yarn自己检测硬件进行配置,默认false yarn.nodemanager.resource.detect-hardware-capabilities

//是否将虚拟核数当作CPU核数,默认false yarn.nodemanager.resource.count-logical-processors-as-cores

//虚拟核数和物理核数乘数,例如:4核8线程,该 参数就应设为2,默认1.0 yarn.nodemanager.resource.pcores-vcores-multiplier

//NodeManager使用内存,默认8G yarn.nodemanager.resource.memory-mb

//NodeManager为系统保留多少内存 以上二个参数配置一个即可 yarn.nodemanager.resource.system-reserved-memory-mb

//NodeManager使用CPU核数,默认8个 yarn.nodemanager.resource.cpu-vcores

//是否开启物理内存检查限制container,默认打开 yarn.nodemanager.pmem-check-enabled

//是否开启虚拟内存检查限制container,默认打开 yarn.nodemanager.vmem-check-enabled

//虚拟内存物理内存比例,默认2.1 yarn.nodemanager.vmem-pmem-ratio

  1. <a name="1eS7o"></a>
  2. ### Container
  3. ```bash
  4. //容器最最小内存,默认1G
  5. yarn.scheduler.minimum-allocation-mb
  6. //容器最最大内存,默认8G
  7. yarn.scheduler.maximum-allocation-mb
  8. //容器最小CPU核数,默认1个
  9. yarn.scheduler.minimum-allocation-vcores
  10. //容器最大CPU核数,默认4个
  11. yarn.scheduler.maximum-allocation-vcores

容量调度器demo

需求 1:default 队列占总内存的 40%,最大资源容量占总资源 60%,
hive 队列占总内存 的 60%,最大资源容量占总资源 80%。
需求 2:配置队列优先级

capacity-scheduler.xml

<!-- 指定多队列,增加 hive 队列 --> 
<property>
   <name>yarn.scheduler.capacity.root.queues</name>
   <value>default,hive</value>
</property>
<!-- 降低 default 队列资源额定容量为 40%,默认 100% --> 
<property>
   <name>yarn.scheduler.capacity.root.default.capacity</name>
   <value>40</value>
</property>
<!-- 降低 default 队列资源最大容量为 60%,默认 100% --> 
<property>
   <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
   <value>60</value>
</property>
<!-- 指定 hive 队列的资源额定容量 --> 
<property>
   <name>yarn.scheduler.capacity.root.hive.capacity</name>
   <value>60</value>
</property>
<!-- 指定 hive 队列的资源最大容量 --> 
<property>
   <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
   <value>80</value>
</property>


<!-- 一个用户最多能够获取该队列资源容量的比例,取值 0-1 --> 
<property>
   <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
</property>

//hive队列的设置
<!-- 启动 hive 队列 --> 
<property>
   <name>yarn.scheduler.capacity.root.hive.state</name>
   <value>RUNNING</value>
</property>
<!-- 哪些用户有权向队列提交作业 --> 
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
   <value>*</value>
</property>
<!-- 哪些用户有权操作队列,管理员权限(查看/杀死) --> 
<property>
   <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
   <value>*</value>
</property>
<!-- 哪些用户有权配置提交任务优先级 --> 
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
   <value>*</value>
</property>
<!-- 队列中任务的最大生命时长,以秒为单位。任何小于或等于零的值将被视为禁用-->
<property>
   <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
   <value>-1</value>
</property>
<!-- 队列中任务的默认生命时长,以秒为单位。任何小于或等于零的值将被视为禁用 -->
<property>
   <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
   <value>-1</value>
</property>
  • 重启 Yarn 或者执行 yarn rmadmin -refreshQueues
  • 默认的任务提交都是提交到 default 队列的。如果希望向其他队列提交任务,需要在Driver 中声明:

    Configuration conf = new Configuration();
    conf.set(“mapreduce.job.queuename”,”hive”);


公平调度器demo

  • 创建两个队列,分别是 test 和 atguigu(以用户所属组命名)。期望实现以下效果:
    • 若用户提交任务时指定队列,则任务提交到指定队列运行;
    • 若未指定队列,test 用户提交的任务 到root.group.test 队列运行,
    • atguigu 提交的任务到 root.group.atguigu 队列运行(注:group为用户所属组)。
  • 公平调度器的配置涉及到两个文件,
    • 一个是 yarn-site.xml,
    • 另一个是公平调度器队列分配文件 fair-scheduler.xml(文件名可自定义)。

(1)配置文件参考资料:
https://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
(2)任务队列放置规则参考资料:
https://blog.cloudera.com/untangling-apache-hadoop-yarn-part-4-fair-scheduler-queue-basics/

yarn-site.xml

<property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    <description>配置使用公平调度器</description> 
</property>
<property>
    <name>yarn.scheduler.fair.allocation.file</name> 
    <value>/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xml</value> 
    <description>指明公平调度器队列分配配置文件</description>
</property>
<property> 
    <name>yarn.scheduler.fair.preemption</name> 
    <value>false</value> 
    <description>禁止队列间资源抢占</description>
</property>

fair-scheduler.xml

<?xml version="1.0"?>
<allocations>
<!-- 单个队列中 Application Master 占用资源的最大比例,取值 0-1 ,企业一般配置 0.1 -->
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<!-- 单个队列最大资源的默认值 test atguigu default --> 
<queueMaxResourcesDefault>4096mb,4vcores</queueMaxResourcesDefault>

<!-- 增加一个队列 test --> 
<queue name="test">
<!-- 队列最小资源 --> 
<minResources>2048mb,2vcores</minResources>
<!-- 队列最大资源 --> 
<maxResources>4096mb,4vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认 50,根据线程数配置 --> 
<maxRunningApps>4</maxRunningApps>
<!-- 队列中 Application Master 占用资源的最大比例 --> 
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值为 1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 --> 
<schedulingPolicy>fair</schedulingPolicy>
</queue>

<!-- 增加一个队列 atguigu -->
<queue name="atguigu" type="parent">
<!-- 队列最小资源 --> 
<minResources>2048mb,2vcores</minResources>
<!-- 队列最大资源 --> 
<maxResources>4096mb,4vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认 50,根据线程数配置 --> 
<maxRunningApps>4</maxRunningApps>
<!-- 队列中 Application Master 占用资源的最大比例 --> 
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值为 1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 --> 
<schedulingPolicy>fair</schedulingPolicy>
</queue>


<!-- 任务队列分配策略,可配置多层规则,从第一个规则开始匹配,直到匹配成功 --> 
<queuePlacementPolicy>
<!-- 提交任务时指定队列,如未指定提交队列,则继续匹配下一个规则; false 表示:如果指 定队列不存在,不允许自动创建-->
<rule name="specified" create="false"/>
<!-- 提交到 root.group.username 队列,若 root.group 不存在,不允许自动创建;若 root.group.user 不存在,允许自动创建 -->
    <rule name="nestedUserQueue" create="true">
    <rule name="primaryGroup" create="false"/>
</rule>
<!-- 最后一个规则必须为 reject 或者 default。Reject 表示拒绝创建提交失败, default 表示把任务提交到 default 队列 -->
   <rule name="reject" />
</queuePlacementPolicy>
</allocations>