hadoop3.x yarn 调度策略:Fair Scheduler(公平调度)根据linux登录名提交到队列 作者:马育民 • 2022-01-05 15:48 • 阅读:10326 # 修改yarn-site.xml配置 登录 `hadoop2` 修改 `yarn-site.xml` 文件: ``` vim /program/hadoop-3.0.3/etc/hadoop/yarn-site.xml ``` 增加下面内容: ### 指定公平调度方式 ``` yarn.resourcemanager.scheduler.class org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler ``` ### 指定配置文件路径 ``` yarn.scheduler.fair.allocation.file fair-scheduler.xml ``` **解释:** - 默认是 `$HADOOP_HOME/etc/hadoop/` 路径,也可以写全路径 - 默认文件名是:`fair-scheduler.xml` - 也就是说,如果文件路径是:`$HADOOP_HOME/etc/hadoop/fair-scheduler.xml` ,即使不写上面配置,也会自动加载该文件 **提示:** `yarn.scheduler.fair.allocation.file` 指定的文件每隔 10秒 加载一次,所以修改此文件,不需要重启 yarn ### 指定 虚拟内存和物理内存比例 虚拟内存的比例,默认是 `2.1`,即每使用 `1G` 物理内存,分配 `2.1` 的虚拟内存。 虚拟内存不够也会报oom,在nodemanager的日志中可以看到。 ``` yarn.nodemanager.vmem-pmem-ratio 4 ``` ### 开启抢占 ``` yarn.scheduler.fair.preemption true yarn.scheduler.fair.preemption.cluster-utilization-threshold 0.8f ``` ### linux用户名作为队列名 ``` yarn.scheduler.fair.user-as-default-queue true ``` **解释:** - 默认true,提交任务未指定队列时,默认是将当前 **linux登录用户名** 作为队列名。可实现根据用户名自动分配队列 - 设置成false,当任务中未指定资源池的时候,将使用默认的队列,即:`root.default`,可在 `fair-scheduler.xml` 中配置默认队列 ### 禁止创建未定义的队列 ``` yarn.scheduler.fair.allow-undeclared-pools false ``` **解释:** - 默认为true,如果提交任务时指定 **没有** 的队列,会 **自动创建** 该队列。 - 设置为false,提交任务时应该指定 **已有** 的队列,如果指定的队列不存在,就会提交到 `root.default` 队列中 ### yarn.scheduler.fair.user-as-default-queue 和 yarn.scheduler.fair.allow-undeclared-pools 的关系 - 如果 `yarn.scheduler.fair.allow-undeclared-pools = true` ,`yarn.scheduler.fair.user-as-default-queue = true`,用 **linux登录用户名** 作为队列名,如果没有该队列,就会创建该队列(一般不这么操作) - 如果 `yarn.scheduler.fair.allow-undeclared-pools = false`,`yarn.scheduler.fair.user-as-default-queue = true`,用 **linux登录用户名** 作为队列名,那么: - 如果 **有 该队列**,会将该任务分配到 **该队列** - 如果 **没有 该队列**,会将该任务分配到 **默认队列**,一般为:`root.default` ### 关键 关键 关键 关键 不要有下面配置,如果有,要删除掉 或 注释掉: ``` yarn.nodemanager.resource.memory-mb 3072 ``` 此配置会影响 公平调度器 队列内存,所以不要有该配置,详见 [链接](https://www.malaoshi.top/show_1IX4AUUdB8ST.html "链接") # 修改fair-scheduler.xml配置 新建 `fair-scheduler.xml` 文件: ``` vim /program/hadoop-3.0.3/etc/hadoop/fair-scheduler.xml ``` 内容如下: ``` 2048mb,1vcores 8192mb,4vcores 10 1.0 fair 2048mb,1vcores 8192mb,4vcores 5 fair 2.0 * 2048mb,1vcores 8192mb,4vcores 10 fair 1.0 dev,flink dev,flink 2048mb,1vcores 8192mb,4vcores 5 fair 1.0 test test ``` **解释:** - 全局配置:全局配置可以没有。其作用是:当队列配置项没有,但全局配置有此项,那么该队列就取该全局配置项 - 内存、核心:设置的最大资源是:`8192mb` 内存,`4个` 核心,但虚拟机 物理内存只有 `8G`,也就是说不是真的的物理内存(这里设置20G也可以生效) - weight:权重,资源不够,抢占资源时,按照比例进行分配 **注意:** - ` `、` `如果是空,必须有空格,否则报空指针错 - 队列名 与 `aclSubmitApps` 名,linux用户要同名 ### 并发执行任务 的数量 执行 mapreduce 自带的 wordcount 时,需要的 **最小资源** 是 `2048mb` 内存 和 `1个` 核心,所以 **理论上** 最多能 **同时运行 `4个`** wordcount 程序。 **但实际上**,最多只能 **同时运行 `2个`** wordcount 程序,因为 **AM也需要内存** #### 注意 由于上面原因,运行一些程序(hive、spark、flink 等),如果没有指定运行内存,可能最多只能 **同时运行 `2个`** 程序 # 同步 登录 `hadoop2`,执行下面命令 同步配置文件: 同步到 hadoop1: ``` rsync -av /program/hadoop-3.0.3/etc/hadoop/* root@hadoop1:/program/hadoop-3.0.3/etc/hadoop/ ``` 同步到 hadoop3: ``` rsync -av /program/hadoop-3.0.3/etc/hadoop/* root@hadoop3:/program/hadoop-3.0.3/etc/hadoop/ ``` # 重启 yarn 登录 `hadoop2`,执行下面命令关闭 yarn: ``` stop-yarn.sh ``` ``` start-yarn.sh ``` # web 查看队列 访问:http://hadoop2:8088/ ,查看队列,显示界面如下: [](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2022-01-05_23-25-34.png) 可以看到队列 `root.default`、`root.dev`、`root.spark` [](/upload/0/0/1IX4AVLNTopr.png) 可以看到配置项已生效 # 测试1 **同时** 在 `hadoop1`、`hadoop2`、`hadoop3` 执行下面命令: ### hadoop1 运行命令 ``` hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount /test2/data.txt /yarn_result/1 ``` **参数解释:** - `/test2/data.txt`:读取 HDFS 文件 - `/result-1`:将结果写入到 HDFS上 ### hadoop2 运行命令 ``` hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount /test2/data.txt /yarn_result/2 ``` ### hadoop3 运行命令 ``` hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount /test2/data.txt /yarn_result/3 ``` # 访问 yarn http://hadoop2:8088/cluster/apps 可以看到 **同时只运行 2个 程序**,有 **1个 程序在等待分配资源**,如下图: [](/upload/0/0/1IX49iCavI6k.png) ### 查看队列 [](/upload/0/0/1IX49iSUqIzQ.png) 启动 MapReduce时,没有指定 队列,默认提交到 `root.default` 中 # 测试2 使用 spark 用户提交应用,以用户名作为队列名,自动提交到 `root.spark` 队列 ### 创建用户 必须在 hdfs服务器(即:hadoop1)上 创建 `spark` 用户,并指定 `supergroup` 用户组(因为是 HDFS的超级用户组),还要刷新 hdfs 用户、用户组映射 创建用户: ``` useradd spark ``` 设置密码: ``` passwd spark ``` 创建 `supergroup` 组(因为 HDFS 默认用户组就是`supergroup`): ``` groupadd supergroup ``` 将 `spark` 用户追加到 `supergroup` 组 ``` usermod -a -G supergroup spark ``` 刷新 hdfs 用户、用户组映射 ``` hdfs dfsadmin -refreshUserToGroupsMappings ``` 执行结果: ``` Refresh user to groups mapping successful ``` ### 在 hdfs服务器(hadoop1) 测试 切换 `spark` 用户: ``` su spark ``` 执行命令: ``` yarn jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar pi 2 2 ``` 访问:http://hadoop2:8088/ ,可以看到提交到 `root.spark` 队列 ### 在 非hdfs服务器(hadoop1) 测试 所在机器必须有 spark 用户,不需要有 `supergroup` 组 执行下面命令创建用户: ``` useradd spark ``` 切换 `spark` 用户: ``` su spark ``` 执行命令: ``` yarn jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar pi 2 2 ``` 访问:http://hadoop2:8088/ ,可以看到提交到 `root.spark` 队列 ### 用 root 用户提交应用 在 `root` 用户下,执行下面命令: ``` yarn jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar pi 2 2 ``` 同时,在 `spark` 用户下,执行该命令 访问:http://hadoop2:8088/ ,如下图: [](/upload/0/0/1IX4GRywMP7K.png) 2个应用同时执行,一个在 `root.default` 队列,一个在 `root.spark` 队列 原文出处:http://malaoshi.top/show_1IX2XOnbCeyW.html