Hadoop_Yarn实践 (三) => (Yarn的基础架构、原理、容量/公平调度器、Tool接口、Yarn常用命令、核心参数)
目录
- Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (三)
- 一、Hadoop_HDFS
- 二、Hadoop_MapReduce
- 三、Hadoop_Yarn
- 1、Yarn资源调度
- 1.1、基础架构
- 1.2、Yarn的工作调度机制(Job提交过程)
- 1.3、Yarn 调度器和调度算法
- 1.3.1、先进先出调度器(FIFO)
- 1.3.2、容量调度器(CapacityScheduler)默认
- 1.3.3、公平调度器(Fair Scheduler)
- 1.4、Yarn常用命令
- 1.5、Yarn生产环境核心参数配置
- 2、Yarn案例实操
- 2.1、配置多队列的容量调度器
- 2.1.1、**需求**
- 2.1.2、**向配置的Hive队列提交任务**
- 2.2、公平调度器案例
- 2.2.1、需求:
- 2.2.2、配置多队列的公平调度器
- 2.2.3、分发配置并重启Yarn
- 2.2.4、测试提交任务
- 3、Yarn 的 Tool 接口案例
- 3.1、需求: 自己写的程序也可以动态修改参数。编写 Yarn 的 Tool 接口。
- 1、新建Maven项目YarnDemo,pom如下:
- 2、创建包名 `com.leojiang.yarn`
- 3、创建类 WordCount 并实现 Tool 接口
- 4、创建WordCountDriver类
- 5、打包
- 6、拷贝jar包到Linux服务器上
- 7、运行测试
- 4、总结
- 1、Yarn的工作机制
- 2、Yarn的调度器
- 3、开发需要掌握的重点
- (END)
Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (三)
一、Hadoop_HDFS
二、Hadoop_MapReduce
三、Hadoop_Yarn
Yarn 是一个资源调度平台,负责为运算程序,提供服务器运算资源,相当于一个分布式的操作系统平台。
而 MapReduce 等运算程序则相当于,运行在操作系统之上的应用程序。
1、Yarn资源调度
1.1、基础架构
1.2、Yarn的工作调度机制(Job提交过程)
提交过程—>Yarn
提交过程—>MapReduce
1.3、Yarn 调度器和调度算法
目前,Hadoop 作业调度器主要有三种:先进先出调度器(FIFO)、容量调度器(Capacity Scheduler)和公平调度器(Fair Scheduler)。
- Apache Hadoop3.3.1 默认的资源调度器是 Capacity Scheduler。
- CDH 框架默认调度器是 Fair Scheduler。
yarn-default.xml 文件查看默认参数:
<property><description>The class to use as the resource scheduler.</description><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value></property>
1.3.1、先进先出调度器(FIFO)
优点:简单易懂
缺点:不支持多队列并发,生产环境很少使用
1.3.2、容量调度器(CapacityScheduler)默认
1、CapacityScheduler 是 Yahaoo 开发的多以用户调度器。
- 多队列:每个队列可配置一定的资源量,每个队列采用 FIFO 调度策略。
- 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
- 灵活性:如果一个队列中的资源有剩余,可以暂时共享给哪些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
- 多租户:
支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对统一用户提交的作业所占资源进行限定
。
2、容量调度器资源分配算法:
1.3.3、公平调度器(Fair Scheduler)
1、Fair Scheduler 是 Facebook 开发的多用户调度器。
1)与容量调度器相同点
- 多队列:支持多队列多作业
- 容量保证:管理员可以为每个队列设置资源最低保证和资源使用上限
- 灵活性:如果一个队列中的资源有剩余,可以暂时共享给哪些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列
- 多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对统一用户提交的作业所占资源进行限定。
2)与容量调度器不同点
-
核心调度策略不同
容量调度器:优先选择资源利用率低的队列
公平调度器:优先选择对资源的缺额比例大的 -
每个队列可以单独设置资源分配方式
容量调度器:FIFO、DRF
公平调度器:FIFO、FAIR(默认)、DRF
1 、公平调度器:缺额
- 公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。某一时刻一个作业应获资源和实际获取资源的差距叫 " 缺额 "
- 调度器会优先为缺额大的作业分配资源
2、公平调度器分配方式设置为:FIFO
- 公平调度每个队列资源分配策略如果选择 FIFO 的话,此时公平调度器相当于上面讲过的容量调度器。
3、公平调度器分配方式设置为:FAIR(默认)
4、公平调度器分配方式设置为:FDRF策略
2、公平调度器资源分配算法(Fair Scheduler)
1.4、Yarn常用命令
hadoop-3.3.1]$ cd /var/opt/hadoopSoftware/hadoop-3.3.1# 运行一个任务
hadoop-3.3.1]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /tinput /toutput1
查看任务:
1、使用监控页面查看
# YARN的ResourceManager
http://hadoop2:8088
2、使用Yarn命令查看
# 1、列出所有 Application
$ yarn application -list# 2、根据 Application 状态过滤:yarn application-list-appStates(所有状态:ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)
$ yarn application -list -appStates FINISHED# 3、Kill 掉 Application
$ yarn application -kill <Application-Id># 4、查询 Application 日志
$ yarn logs -applicationId <Application-Id># 5、查询 Container 日志(contaiinerId 可以通过步骤 6、进行查看)
$ yarn logs -applicationId <ApplicationId> -contaiinerId <ContainerId># 6、查看尝试运行的任务
$ yarn applicationattempt -list <ApplicationId># 7、打印 ApplicationAttempt 状态
$ yarn applicationattempt -status <ApplicationAttemptId># 8、查看当前app一共有多少个容器
$ yarn container -list <ApplicationAttemptId># 9、查看当前 Container 状态
$ yarn container -status <ContainerId># 10、查看node节点状态
$ yarn node -list -all# 11、加载队列配置(动态更新yarn配置)
$ yarn rmadmin -refreshQueues# 12、打印队列信息
$ yarn queue -status <QueueName>
eg: yarn queue -status default
Queue Information :
Queue Name : defaultState : RUNNINGCapacity : 100.00%Current Capacity : .00%Maximum Capacity : 100.00%Default Node Label expression : <DEFAULT_PARTITION>Accessible Node Labels : *Preemption : disabledIntra-queue Preemption : disabled
1.5、Yarn生产环境核心参数配置
(根据自身服务器容量以及app需求进行配置)
# 自定义配置文件位置$HADOOP_HOME/etc/hadoop/yarn-site.xml
# 默认配置文件位置$HADOOP_HOME/share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml1)ResourceManager相关
# 配置调度器,默认是容量调度器(大公司资源够要求性能好,可以选择公平调度器)<property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value></property># ResourceManager 处理调度器接口的线程数 默认50<property><name>yarn.resourcemanager.scheduler.client.thread-count</name><value>50</value></property>2)NodeManager相关
# 是否启用自动检测节点功能,让yarn自己检查硬件进行配置 默认false<property><name>yarn.nodemanager.resource.detect-hardware-capabilities</name><value>false</value></property># 是否将虚拟核数当作CPU核数 默认false<property><description>Flag to determine if logical processors(such as hyperthreads) should be counted as cores. Only applicable on Linux when yarn.nodemanager.resource.cpu-vcores is set to -1 and yarn.nodemanager.resource.detect-hardware-capabilities is true.</description><name>yarn.nodemanager.resource.count-logical-processors-as-cores</name><value>false</value></property># 默认为1,表示一个物理cpu当做一个vcore使用,如果我们已经预留给了服务器cpu的话,那我们这里可以调整问题2或者3<property><description>Multiplier to determine how to convert phyiscal cores to vcores. This value is used if yarn.nodemanager.resource.cpu-vcores is set to -1(which implies auto-calculate vcores) and yarn.nodemanager.resource.detect-hardware-capabilities is set to true. The number of vcores will be calculated as number of CPUs * multiplier.</description><name>yarn.nodemanager.resource.pcores-vcores-multiplier</name><value>1.0</value></property># NodeManager使用的内存 默认8G<property><description>Amount of physical memory, in MB, that can be allocated for containers. If set to -1 and yarn.nodemanager.resource.detect-hardware-capabilities is true, it is automatically calculated(in case of Windows and Linux). In other cases, the default is 8192MB.</description><name>yarn.nodemanager.resource.memory-mb</name><value>-1</value></property># NodeManager 为系统保留多少内存(为非yarn进程保留的物理内存量,单位为MB)<property><description>Amount of physical memory, in MB, that is reserved for non-YARN processes. This configuration is only used if yarn.nodemanager.resource.detect-hardware-capabilities is set to true and yarn.nodemanager.resource.memory-mb is -1. If set to -1, this amount is calculated as 20% of (system memory - 2*HADOOP_HEAPSIZE)</description><name>yarn.nodemanager.resource.system-reserved-memory-mb</name><value>-1</value></property># 是否开启 物理内存 检查限制container 默认打开<property><description>Whether physical memory limits will be enforced forcontainers.</description><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value></property># 是否开启 虚拟内存 检查限制container 默认打开 (一般会关闭虚拟内存检测,因为java和centos78在分配虚拟内存是会有些冲突所以一般会关闭这个参数)<property><description>Whether virtual memory limits will be enforced forcontainers.</description><name>yarn.nodemanager.vmem-check-enabled</name><value>true</value></property># 虚拟内存 与 物理内存比例 默认2.1<property><description>Ratio between virtual memory to physical memory when setting memory limits for containers. Container allocations are expressed in terms of physical memory, and virtual memory usage is allowed to exceed this allocation by this ratio.</description><name>yarn.nodemanager.vmem-pmem-ratio</name><value>2.1</value></property>3)Container 相关
# 容器的最小内存 默认1G<property><description>The minimum allocation for every container request at the RM in MBs. Memory requests lower than this will be set to the value of this property. Additionally, a node manager that is configured to have less memory than this value will be shut down by the resource manager.</description><name>yarn.scheduler.minimum-allocation-mb</name><value>1024</value></property># 容器的最大内存 默认8G<property><description>The maximum allocation for every container request at the RM in MBs. Memory requests higher than this will throw an InvalidResourceRequestException.</description><name>yarn.scheduler.maximum-allocation-mb</name><value>8192</value></property># 容器的最小CPU核数 默认1个<property><description>The minimum allocation for every container request at the RM in terms of virtual CPU cores. Requests lower than this will be set to the value of this property. Additionally, a node manager that is configured to have fewer virtual cores than this value will be shut down by the resource manager.</description><name>yarn.scheduler.minimum-allocation-vcores</name><value>1</value></property># 容器的最大CPU核数 默认4个<property><description>The maximum allocation for every container request at the RM in terms of virtual CPU cores. Requests higher than this will throw an InvalidResourceRequestException.</description><name>yarn.scheduler.maximum-allocation-vcores</name><value>4</value></property>
修改参数后分发到所有服务器,然后重启即可
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml# 停止
hadoop1 $ myhadoop stop
# 启动
hadoop1 $ myhadoop start
2、Yarn案例实操
2.1、配置多队列的容量调度器
在生产环境怎么创建队列?
-
A、调度器默认就1个 default 队列,不能满足生产要求。
-
B、按照框架:hive /spark/ flink 每个框架的任务放入指定的队列 (企业用的不是特别多)
-
C、按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2
创建多队列的好处?
-
A、因为担心员工不小心,写递归死循环代码,把所有资源全部耗尽。
-
B、实现任务的降级使用,特殊时期保证重要的任务队列资源充足,比如 双11、6.18等
业务部门1(重要)=》业务部门2(比较重要)=》下单(一般)=》购物车(一般)=》登录注册(次要)
2.1.1、需求
-
需求1:default队列占总内存的40%,最大资源容量占总资源60%,
hive队列占总内存的60%,最大资源容量占总资源80%。
在文件位置$HADOOP_HOME/etc/hadoop/capacity-scheduler.xml
中配置如下:
<!-- 指定多队列,增加hive队列 --><property><name>yarn.scheduler.capacity.root.queues</name><value>default,hive</value><description>The queues at the this level (root is the root queue).</description></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>(2)为新加队列添加必要属性:<!-- 为新加队列添加必要属性:指定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><!-- 任务的超时时间设置:yarn application -appId appId -updateLifetime Timeout参考资料:https://blog.cloudera.com/enforcing-application-lifetime-slas-yarn/ --><!-- 如果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>
分发配置文件,然后重启 Yarn 或者执行yarn rmadmin -refreshQueues
刷新队列,http://hadoop2:8088 就可以看到两条队列:
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/capacity-scheduler.xml
hadoop1 $ yarn rmadmin -refreshQueues
2.1.2、向配置的Hive队列提交任务
1)hadoop jar 的方式
# 修改提交任务的方式,默认是default。eg:向Hive队列提交任务
hadoop-3.3.1]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount -D mapreduce.job.queuename=hive /input /output2
2)打 jar 包的方式(推荐)
默认的任务提交都是提交到 default 队列的。如果希望向其他队列提交任务,在Driver中声明即可:
public class WcDrvier {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {Configuration conf = new Configuration();conf.set("mapreduce.job.queuename","hive");//1. 获取一个Job实例Job job = Job.getInstance(conf);…………//6. 提交Jobboolean b = job.waitForCompletion(true);System.exit(b ? 0 : 1);}
}
- 需求2:配置队列优先级
容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。默认情况,Yarn将所有任务的优先级限制为0,若想使用任务的优先级功能,须开放该限制。
1)修改yarn-site.xml文件,增加以下参数
hadoop1 $ vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<property><name>yarn.cluster.max-application-priority</name><value>5</value>
</property>
2)同步并重启yarn
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xmlhadoop2 $ $HADOOP_HOME/sbin/stop-yarn.shhadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh
3)模拟资源紧张环境,可连续提交以下任务,直到新提交的任务申请不到资源为止。
hadoop1 hadoop-3.3.1]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 5 2000000
4)再次重新提交优先级高的任务(可以通过yarn监控页面查看任务执行的优先级 http://hadoop2:8088)
hadoop2 hadoop-3.3.1]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi -D mapreduce.job.priority=5 5 2000000
5)也可以通过以下命令修改 正在执行的任务 的优先级
# yarn application -appID <ApplicationID> -updatePriority 优先级hadoop-3.3.1]$ yarn application -appID application_1611133087930_0009 -updatePriority 5
2.2、公平调度器案例
2.2.1、需求:
创建两个队列,分别是 test 和fancyry(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test 用户提交的任务到 root.group.test 队列运行,fancyry提交的任务到 root.group.fancyry 队列运行 (注:group为用户所属组)。
公平调度器的配置涉及到两个文件,一个是 yarn-site.xml,另一个是公平调度器队列分配文件 fair-scheduler.xml (文件名可自定义)。
2.2.2、配置多队列的公平调度器
修改 $HADOOP_HOME/etc/hadoop/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>/var/opt/hadoopSoftware/hadoop-3.3.1/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 (队列test)
$HADOOP_HOME/etc/hadoop/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占用资源的最大比例(服务器性能好的话一般配置0.1就够了) --><maxAMShare>0.5</maxAMShare><!-- 该队列资源权重,默认值为1.0 --><weight>1.0</weight><!-- 队列内部的资源分配策略 --><schedulingPolicy>fair</schedulingPolicy></queue><!-- 增加一个队列 leojiang --><queue name="leojiang" type="parent"><!-- 队列最小资源 --><minResources>2048mb,2vcores</minResources><!-- 队列最大资源 --><maxResources>4096mb,4vcores</maxResources><!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 --><maxRunningApps>4</maxRunningApps><!-- 该队列资源权重,默认值为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>
tips:
maxAMShare:限制可用于运行应用程序主节点的队列公平份额的比例。此属性只能用于叶队列。例如,如果设置为 1.0f,则叶队列中的 AM 最多可以占用 100% 的内存和 CPU 公平份额。值 -1.0f 将禁用此功能,并且不会检查 amShare。默认值为 0.5f。
2.2.3、分发配置并重启Yarn
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/fair-scheduler.xmlhadoop2 $ $HADOOP_HOME/sbin/stop-yarn.shhadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh
2.2.4、测试提交任务
1、页面刷新可以看到新的调度器
# YARN的ResourceManager
http://hadoop2:8088
2、提交任务时指定队列,按照配置规则,任务会到指定的 root.test 队列
hadoop2 hadoop-3.3.1]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi -D mapreduce.job.queuename=root.test 1 1
3、提交任务时不指定队列,按照配置规则,任务会到root队列,用哪个用户登录运行就在那个用户下
hadoop2 hadoop-3.3.1]$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 1 1
3、Yarn 的 Tool 接口案例
回顾:World count 案例
hadoop2 hadoop-3.3.1]$ hadoop jar helloworld-maven-java.jar com.leojiang.mapreduce.wordcount2.WordCountDriver /input /output
期望可以动态传参,结果报错,误认为是第一个输入参数。
hadoop2 hadoop-3.3.1]$ hadoop jar helloworld-maven-java.jar com.leojiang.mapreduce.wordcount2.WordCountDriver -Dmapreduce.job.queuename=root.test /input /output2
3.1、需求: 自己写的程序也可以动态修改参数。编写 Yarn 的 Tool 接口。
1、新建Maven项目YarnDemo,pom如下:
pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.leojiang.yarn</groupId><artifactId>YarnDemo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><!-- main文件下无法使用,如果相要使用需要修改为 compile --><!-- <scope>test</scope>--><scope>compile</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.30</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.4</version></dependency></dependencies></project>
2、创建包名 com.leojiang.yarn
3、创建类 WordCount 并实现 Tool 接口
package com.leojiang.yarn;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;import java.io.IOException;// Alt + enter 实现相关的方法
public class WordCount implements Tool {private Configuration conf;// 核心驱动(conf 需要传入)@Overridepublic int run(String[] args) throws Exception {Job job = Job.getInstance(conf);job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));return job.waitForCompletion(true) ? 0 : 1;}@Overridepublic void setConf(Configuration conf) {this.conf = conf;}@Overridepublic Configuration getConf() {return conf;}// mapperpublic static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {private Text outK = new Text();private IntWritable outV = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 获取一行String line = value.toString();
// String[] words = line.split("");// 去除首尾空格String tline = line.trim();// s表示匹配任何空白字符,+表示匹配一次或多String[] words = tline.split("\\s+");for (String word : words) {outK.set(word);context.write(outK, outV);}}}// reducerpublic static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable outV = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable value : values) {sum += value.get();}outV.set(sum);context.write(key, outV);}}
}
4、创建WordCountDriver类
package com.leojiang.yarn;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;import java.util.Arrays;public class WordCountDriver {private static Tool tool;public static void main(String[] args) throws Exception {// 创建配置Configuration conf = new Configuration();switch (args[0]) {case "wordcount":tool = new WordCount();break;default:throw new RuntimeException("no such tool" + args[0]);}// 执行程序int run = ToolRunner.run(conf, tool, Arrays.copyOfRange(args, 1, args.length));System.exit(run);}
}
5、打包
6、拷贝jar包到Linux服务器上
7、运行测试
查看 Driver 类的全列名 com.leojiang.yarn.WordCountDriver
在 HDFS 上准备输入文件 /input 目录,向集群提交该 Jar 包
hadoop1 hadoop-3.3.1]$ yarn jar $HADOOP_HOME/test-jar/YarnDemo-1.0-SNAPSHOT.jar com.leojiang.yarn.WordCountDriver wordcount /input /output4
注意此时提交的 3 个参数,第一个用于生成特定的 Tool,第二个和第三个为输入输出目录。此时如果我们希望加入设置参数,可以在 wordcount 后面添加参数,例如:
hadoop1 hadoop-3.3.1]$ yarn jar $HADOOP_HOME/test-jar/YarnDemo-1.0-SNAPSHOT.jar com.leojiang.yarn.WordCountDriver wordcount -Dmapreduce.job.queuename=root.test /input /output5
4、总结
1、Yarn的工作机制
2、Yarn的调度器
1)FIFO、容量、公平
2)apache默认调度器 =》容量; CDH默认调度器= =》公平
3)公平、容量 默认有一个default,需要创建多队列
多队列:
- 中小企业:hive spark flink mr
- 中大企业:业务模块:登录、注册、购物车、营销
- 好处:解耦降低风险 双11、618 降级使用
4)每个调度器的特点:
-
相同点:支持多队列、可以借资源、支持多用户
-
不同点:
容量调度器:优先满足先进来的任务执行
公平调度器:在队列里面的任务,公平享有队列资源
5)生产环境怎么选:
- 中小企业:对并发度要求不高,选择容量
- 中大企业:对并发度要求比较高,选择公平
3、开发需要掌握的重点
1)队列原理
2)Yarn常用命令
3)核心参数配置
4)配置容量调度器和公平调度器
5)tool接口的使用
(END)
相关文章:

Hadoop_Yarn实践 (三) => (Yarn的基础架构、原理、容量/公平调度器、Tool接口、Yarn常用命令、核心参数)
目录 Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (三)一、Hadoop_HDFS二、Hadoop_MapReduce三、Hadoop_Yarn1、Yarn资源调度1.1、基础架构1.2、Yarn的工作调度机制(Job提交过程)1.3、Yarn 调度器和调度算法1.3.1、先进先出调度器(FIFO…...

postgresql 从应用角度看快照snapshot使用,事务隔离控制不再神密
专栏内容:postgresql内核源码分析 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 快照使用 快照是事务中使用,配合事务的隔离级别,体现出不同的可见性。…...
mysql(mariadb)读写分离部署
目录 一、原理 二、准备环境 三、部署mysql主从复制 1.五台服务器下载mariadb 2.修改master配置文件,重启数据库 3.登录mysql创建replication 4.从服务器登录验证 5.获得master服务器 DB的相关信息 6.备份master原有数据 7.修改slave1、slave2配置 8. 进入…...

ES-工作原理
前言 搜索引擎是对数据的检索,而数据总体分为两种:结构化数据和非结构化数据。而对于结构化数据,因为他们具有特定的结构,所以一般都是可以通过关系型数据库MySQL/oracle的二维表的方式存储和搜索,也可以建立索引。…...
C++小结(4)
C 字符串 C 提供了两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字…...

Java框架之spring 的 messaging
写在前面 本文看下spring message相关的内容。 1:Message?Messaging? Message是消息的意思,是一个名词。而Messaging是一个动名词,是将消息发送出去的意思,因此,我们的消息系统是messaging s…...

linux使用grep命令查询nginx的进程情况时总是出现 grep --color=auto nginx
问题: 每次使用ps aux | grep 服务名 命令查询某个服务的进程时,总会出现一条grep --colorauto 服务名 例如: ps aux | grep nginx # 会出现图片中的情况解答: 这是因为grep 也是一条命令,它在输出时,会…...
FFmpeg音视频开发知识点(二)
系列文章目录 FFmpeg音视频开发知识点(一) 文章目录 系列文章目录前言一、AAC音频编码1. ffmpeg编译第三方的libfdk_aac2. S16重采样FLTP 二、AAC音频解码总结 前言 该篇讲解一下,音频编解码中的难点,以及开发过程中遇到问题&am…...

【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~
Java可执行命令之jarsigner 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法3.1.1 可选参数:jarsigner -keystore < url>3.1.2 可选参数:jarsigner -storepass <口令>3.1.3 可选参数:jarsigner -keypass <口令>3.1.4 可选参…...

c#调用c++ dll,Release版本内存访问错误
最近遇到个比较经典的案例,在c#中调用yara进行文件检测,yara是c编写的一个非常强大库,github有个大佬用c#对其进行了封装,使其能在跨平台下,只需编译yara的so或dll就能直接跑。但总是在Release版本下时不时就崩溃&…...

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )
内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 ) 在渗透中,有时候 Cobalt Strike 会话可能会受限制,所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上,但是…...

性能测试讲解超详细Jmeter
目录 什么是性能 性能测试的目的 功能测试和性能测试 基准测试 负载测试 稳定性测试 压力测试 并发测试 总结 性能测试指标 响应时间 并发数 吞吐量 点击数 错误率 资源使用率 总结 性能测试流程 性能测试需求分析 性能测试计划和方案 编辑性能测试用例编辑 性…...
微服务 – Spring Cloud – Nacos 配置中心
微服务 – Spring Cloud – Nacos 配置中心 文章目录 微服务 – Spring Cloud – Nacos 配置中心打开nacos面板新建配置引入依赖配置文件启动类业务类打开nacos面板新建配置 Data ID: nacos-config-client-dev.yaml Group: DEV-CLOUD2023 config:info: config info lalalal …...

超细,设计一个“完美“的测试用例,用户登录模块实例...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 好的测试用例一定…...

【C#】文件拖拽,获取文件路径
系列文章 【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…...
SAP PI/PO初步了解 2023.07.03
SAP PI/PO 是SAP 提供的一种集成中间件解决方案,用于在组织内部或不同组织之间实现系统的无缝通信和数据交换。它使企业能够以统一高效的方式集成各种应用和系统,无论这些系统的技术平台或数据格式如何。 以下是关于SAP PI/PO的简要概述: 1…...
Java中生产者消费者模型
在Java中,生产者消费者模型是一种常见的多线程编程模型,用于解决生产者和消费者之间的数据交互问题。 简介 生产者(Producer)负责生成数据,并将数据放入共享的缓冲区(队列)中。消费者…...

测试Hyperledger Fabric环境
首先进入fabric-samples目录中的first-networked 子目录 cd fabric-samples/first-network 在first-network目录下有一个自动化脚本byfn.sh,可以使用-help参数查看相应的可 用命令,在命令提示符中输入如下命令: ./byfn.sh --help命令执行成功后&#…...
ClickHouse查询sql长度超超过最大限制
ClickHouse查询sql长度超超过最大限制 Max query size exceeded ClickHouse exception, message: Code: 62. DB::Exception: Syntax error: failed at position 262102 (‘fwm00ud6a3ynu0kaxr.ya0eyemkbzdvrxkhwgchccll’) (line 10406, col 17): fwm00ud6a3ynu0kaxr.ya0eyemk…...

【Axure教程】拖动调整行高列宽的表格
表格是在系统软件中非常常用的工具。表格通常由行和列组成,用于以结构化的方式显示和组织数据。它们在各种场景中都有广泛的应用,包括数据分析、数据录入、报表生成、项目管理和数据可视化等领域。 今天作者就教大家如何在Axure里制作一个能通过鼠标拖动…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

可下载旧版app屏蔽更新的app市场
软件介绍 手机用久了,app越来越臃肿,老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法,还能帮我们卸载不需要的app。 手机现状 如今的app不断更新,看似在优化,实则内存占用越来越大,对手机性…...