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里制作一个能通过鼠标拖动…...

中间件-netty(1)
netty 前言篇 文章目录 一、IO基础篇1.概念1.1 阻塞(Block)和非阻塞(Non-Block)1.2 同步(Synchronization)和异步(Asynchronous)1.3 BIO 与 NIO 对比1.3.1 面向流与面向缓冲1.3.2 阻塞与非阻塞1.3.3 选择器的问世 2.NIO 和 BIO 如何影响应用程序的设计2.1 API调用2.2 数据处理2…...

【方法】想把PDF文档转换成PPT,如何操作?
很多小伙伴在工作中,会使用PDF或者PPT来展示内容。那如果需要把PDF转换成PPT,要如何操作呢? 我们知道,PPT转换成PDF很容易操作,只需通过PPT的【导出】选项,就可以直接转换成PDF;还可以通过“另…...

Linux--设置目录或文件的默认权限:umask权限掩码
目录起始权限是从777,普通文件起始权限从666 为何我们创建一个目录或文件,默认权限是你所看到的样子? 因为凡是在umask中出现的权限,都不应该在最终权限中出现! 最终权限起始权限&(~umask)…...

C++实现websocket单server单client全双工通信(基于boost!!!)
自身环境:ubuntu18.04gcc7.5.0boost1.7,3 环境配置 gcc或者g一般都有,这里主要介绍一下boost的配置方法 执行如下代码: wget https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.bz2 --no-check-cert…...

好用的网址5
搜番神器:https://trace.moe/ Online converter:Online converter - convert video, images, audio and documents for free 格式转换 GIF Explode:https://gif-explode.com/ SongDonkey:SongDonkey - AI Online Audio Split…...

做项目去实习到底做的什么?
300万字!全网最全大数据学习面试社区等你来! 今天是手机编辑的文章,说说做项目/实习这回事。 我之前发过一些视频,讲校招四要素的,其中一个很重要的部分就是实习。 对社招同学来说,就简单了,面试…...

VSC++: 验证身份证
缘由https://ask.csdn.net/questions/1082358 void 验证身份证() {//缘由https://ask.csdn.net/questions/1082358int 权重[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }, 个 0, j 0, a 0, he 0;char M[] "10X98765432", 身份号[100][20]{};//…...

机器学习-方差和偏差理论
机器学习-方差和偏差理论 关于机器学习方差和偏差的内容其实很重要,这个方差和偏差可以帮助我们去分析,模型的泛化能力和过拟合的程度。 下面我们先给存储方差和偏差的公式: 注意,下式当中, f ( x ; D ) 表示在数据集…...

力扣 669. 修剪二叉搜索树
题目来源:https://leetcode.cn/problems/trim-a-binary-search-tree/description/ C题解1:递归法。当前节点为空时返回空,不为空时对其值进行分类讨论。以low为例,当前节点值等于low时,意味着其左子树都要丢弃…...

ChatGPT在多轮对话中的表现如何?
ChatGPT是一个非常强大的自然语言处理模型,它可以生成高质量的自然语言文本,并且在多轮对话中也有很好的表现。以下是关于ChatGPT在多轮对话中表现的详细介绍: 上下文感知 ChatGPT可以通过上下文感知来理解当前对话的语境和主题。在多轮对话…...