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>