Yarn


文章目录

  • Yarn
  • 1、常用命令
  • 查看任务(yarn application)
  • 查看日志(yarn logs)
  • 查看尝试运行的任务(yarn applicationattempt)
  • 查看容器(yarn container)
  • 查看节点状态(yarn node)
  • 查看队列(yarn queue)
  • 2、生产环境核心参数
  • 3、Yarn 案例实操
  • Yarn 生产环境核心参数配置案例
  • 容量调度器多队列提交案例
  • 公平调度器案例


1、常用命令

查看任务(yarn application)

  • 列出所有 Application
  • yarn application -list
  • 根据 Application 状态过滤(所有状态:ALL、NEW、 NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)
  • yarn application -list -appStates <状态(ALL/RUNNING/FINISHED/...)>
  • Kill 掉 Application
  • yarn application -kill <ApplicationId>


查看日志(yarn logs)

  • 查询 Application 日志
  • yarn logs -applicationId <ApplicationId>
  • 查询 Container 日志
  • yarn logs -applicationId <ApplicationId> -containerId <ContainerId>


查看尝试运行的任务(yarn applicationattempt)

  • 列出所有 Application 尝试的列表
  • yarn applicationattempt -list <ApplicationId>
  • 打印 ApplicationAttemp 状态
  • yarn applicationattempt -status <ApplicationAttemptId>


查看容器(yarn container)

  • 列出所有 Container
  • yarn container -list <ApplicationAttemptId>
  • 打印 Container 状态
  • yarn container -status <ContainerId>


查看节点状态(yarn node)

  • 列出所有节点
  • yarn node -list -all


查看队列(yarn queue)

  • 打印队列信息
  • yarn queue -status <QueueName>


2、生产环境核心参数

参数

解释

yarn.resourcemanager.scheduler.class

配置调度器,默认容量

yarn.resourcemanager.scheduler.client.thread-count

ResourceManager处理调度器请求的线程数量,默认50

yarn.nodemanager.resource.detect-hardware-capabilities

是否让yarn自己检测硬件进行配置,默认false

yarn.nodemanager.resource.count-logical-processors-as-cores

是否将虚拟核数当作CPU核数,默认false

yarn.nodemanager.resource.pcores-vcores-multiplier

虚拟核数和物理核数乘数,例如:4核8线程,

该参数就应设为2,默认1.0

yarn.nodemanager.resource.memory-mb

NodeManager使用内存,默认8G

yarn.nodemanager.resource.cpu-vcores

NodeManager使用CPU核数,默认8个

yarn.nodemanager.pmem-check-enabled

是否开启物理内存检查限制container,默认打开

yarn.nodemanager.vmem-check-enabled

是否开启虚拟内存检查限制container,默认打开

yarn.nodemanager.vmem-pmem-ratio

虚拟内存物理内存比例,默认2.1

yarn.scheduler.minimum-allocation-mb

容器最最小内存,默认1G

yarn.scheduler.maximum-allocation-mb

容器最最大内存,默认8G

yarn.scheduler.minimum-allocation-vcores

容器最小CPU核数,默认1个

yarn.scheduler.maximum-allocation-vcores

容器最大CPU核数,默认4个


3、Yarn 案例实操

Yarn 生产环境核心参数配置案例

  • 需求:从 1G 数据中,统计每个单词出现次数。服务器 3 台,每台配置 4G 内存,4 核 CPU,4 线程。
  • 需求分析
  • 1G / 128m = 8 个 MapTask;1 个 ReduceTask;1 个 mrAppMaster
  • 平均每个节点运行 10 个 / 3 台 ≈ 3 个任务(4 3 3)
  • 修改 yarn-site.xml 配置文件参数
<!-- 选择调度器,默认容量 -->
    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
    </property>
    <!-- ResourceManager 处理调度器请求的线程数量,默认 50;如果提交的任务数大于 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 个,修改为 4 个 -->
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>4</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>


容量调度器多队列提交案例

  • 需求:default队列占总内存的40%,最大资源占总资源60%,hive队列占总内存的60%,最大资源占总资源 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>
    <!-- 降低 default 队列资源最大容量为 60%,默认 100% -->
    <property>
        <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
        <value>60</value>
    </property>
  • 为新加队列添加必要属性(capacity-scheduler.xml)
<!-- 指定 hive 队列的资源额定容量 -->
    <property>
        <name>yarn.scheduler.capacity.root.hive.capacity</name>
        <value>60</value>
    </property>
    <!-- 用户最多可以使用队列多少资源,1 表示 -->
    <property>
        <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
        <value>1</value>
    </property>
    <!-- 指定 hive 队列的资源最大容量 -->
    <property>
        <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
        <value>80</value>
    </property>
    <!-- 启动 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>
    <!-- 如果 application 指定了超时时间,则提交到该队列的 application 能够指定的最大超时时间不能超过该值。-->
    <property>
        <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
        <value>-1</value>
    </property>
    <!-- 如果 application 没指定超时时间,则用 default-application-lifetime 作为默认值 -->
    <property>
        <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
        <value>-1</value>
    </property>


公平调度器案例

  • 需求:创建两个队列,分别是 test 和 root。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test 用户提交的任务到 root.group.test 队列运行,root 提交的任务到 root.group.root 队列运行
  • 公平调度器的配置涉及到两个文件
  • 一个是 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.scheduler.fair.allocation.file</name>
        <value>/opt/software/hadoop/hadoop-3.1.4/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>
    <!-- 增加一个队列 test2 (队列名字自定义)-->
    <queue name="test2" 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>