Hadoop, 大数据

hadoop-22 Yarn案例实操

创建系统快照

修改yarn-site.xml配置参数如下:

<!-- 选择调度器,默认容量调度器 -->
<property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<!-- ResourceManager处理调度器请求的线程数量,默认50,本机3台 * 4线程=12线程,去除其他应用程序,实际不能超过8 -->
<property>
    <name>yarn.resourcemanager.scheduler.client.thread-count</name>
    <value>8</value>
</property>
<!-- 是否让yarn自动检测硬件进行设置,默认是false,如果该节点有很多其他应用程序,建议手动配置,没有则可以采用自动 -->
<property>
    <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
    <value>false</value>
</property>
<!-- 是否将虚拟核数当做cpu核数,默认是false,采用物理CPU核数 -->
<property>
    <name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
    <value>false</value>
</property>
<!-- 虚拟核数和物理核数乘数,默认1.0 -->
<property>
    <name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
    <value>1.0</value>
</property>
<!-- NodeManager使用内存数,默认8G,修改为4G -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
</property>
<!-- NodeManager的cpu的核数,默认8个,修改为2个 -->
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>2</value>
</property>
<!-- 容器最小内存,默认1G -->
<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
</property>
<!-- 容器最大内存,默认8G,修改为2G -->
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>2048</value>
</property>
<!-- 容器最小cpu核数,默认1个 -->
<property>
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
</property>
<!-- 容器最大cpu核数,默认4个,修改为2个-->
<property>
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>2</value>
</property>
<!-- 虚拟内存检测 -->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>
<!-- 虚拟内存和物理内存设置比例,默认2.1 -->
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>2.1</value>
</property>

容量调度器多队列配置

按照框架:

  • hive/spark/flink每个框架的任务放入指定的队列

按照业务模块

  • 登录注册
  • 购物车
  • 下单等

需求:

  • default队列占总内存的40%
  • hive队列占总内存的60%
  • hive队列最大资源容量设置为80%

配置多队列容量调度器:

  • 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>
<property>
    <name>yarn.scheduler.capacity.root.hive.capacity</name>
    <value>60</value>
</property>
<!-- 向队列提交任务的时候,用户能占到总资源的多少 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
    <value>1</value>
</property>

<!-- 降低default队列资源最大容量为60%,默认100% -->
<property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>60</value>
</property>
<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
    <value>80</value>
</property>
<!-- 设置当前队列的状态:启动状态 -->
<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>
<!-- 可以设置提交任务最多执行执行时间 yarn application -appId appId -updateLifetime Timeout -->
<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
  • 提交任务指定队列名称
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.job.queuename=hive /input /output3

java代码中指定提交队列名称

conf.set("mapreduce.job.queuename", "hive");

指定任务优先级

配置yarn-site.xml文件

<property>
     <name>yarn.cluster.max-application-priority</name>
     <value>5</value>
</property>

分发并重启yarn

sync yarn-site.xml
sbin/stop-yarn.xml
sbin/start-yarn.xml
  • 提交任务指定优先级
    • -D mapreduce.job.priority=5
  • 也可以通过以下命令修改正在执行任务的优先级
    • yarn application -appId -updatePriority 优先级

公平调度器

公平调度器的配置涉及两个文件

  • yarn-site.xml
  • fair-scheduler.xml

配置多队列的公平调度器yarn-site.xml

<!-- 配置使用公平调度器 -->
<property>
     <name>yarn.resourcemanager.scheduler.class</name>
     <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

<!-- 指明公平调度器队列分配配置文件 -->
<property>
     <name>yarn.resourcemanager.fair.allocation.file</name>
     <value>/opt/module/hadoop=3.1.3/etc/hadoop/fair-scheduler.xml</value>
</property>

<!-- 禁止队列间资源抢占 -->
<property>
     <name>yarn.scheduler.fair.preemption</name>
     <value>false</value>
</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>
    <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>

分发配置 重启yarn

xsync yarn-site.xml
xsync fair-scheduler.xml
sbin/stop-yarn.sh
sbin/start-yarn.sh

提交任务指定队列

-Dmapreduce.job.queuename=root.test

提交任务不指定队列,按照配置规则会提交到root.atguigu.atguigu队列