【大数据】Hadoop_Yarn➕实操(附详细代码)


前言

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce等运算程序则相当于运行于操作系统之上的应用程序。


一、Yarn资源调度器

1. Yarn基础架构

🚦Yarn主要由ResourceManager、NodeManager、ApplicationMaster和 Container 等组件构成。

  1. ResourceManager(RM):
    1️⃣处理客户端请求
    2️⃣监控NodeManager
    3️⃣启动监控ApplicationMaster
    4️⃣资源的分配与调度
  2. NodeManager(NM):
    1️⃣管理单个节点上的资源
    2️⃣处理来自ResourceManager的命令
    3️⃣处理来自ApplicationMaster的命令
  3. ApplicationMaster(AM):
    1️⃣为应用程序申请资源并分配给内部任务
    2️⃣任务的监控与容错
  4. container容器:container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等

在这里插入图片描述

2. Yarn工作机制(重要)

🌰工作机制图示:
在这里插入图片描述

🚦工作机制详解:

  1. MR程序提交到客户端所在的节点。
  2. YarnRunner向ResourceManager申请一个Application。
  3. RM将该应用程序的资源路径返回给YarnRunner。
  4. 该程序将运行所需资源提交到HDFS上。
  5. 程序资源提交完毕后,申请运行mrAppMaster。
  6. RM将用户的请求初始化成一个Task。
  7. 其中一个NodeManager领取到Task任务。
  8. 该NodeManager创建容器Container,并产生MRAppmaster。
  9. Container从HDFS上拷贝资源到本地。
  10. MRAppmaster向RM 申请运行MapTask资源。
  11. RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
  12. MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
  13. MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
  14. ReduceTask向MapTask获取相应分区的数据。
  15. 程序运行完毕后,MR会向RM申请注销自己。

3. 作业提交全流程

🍔HDFS、YARN、MapReduce三者关系:
在这里插入图片描述

🍔作业提交过程之 HDFS & MapReduce:
在这里插入图片描述

4. Yarn调度器和调度算法(重要)

目前,Hadoop 作业调度器主要有三种:FIFO(没用😅)、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.1.3默认的资源调度器是Capacity Scheduler。CDH框架默认调度器是Fair Scheduler。具体配置详见:yarn-default.xml文件。

4.1. 先进先出调度器(FIFO)

🍔单队列,根据提交作业的先后顺序,先来先服务。
在这里插入图片描述

实际上用不到先进先出调度器,大数据追求高并发,调度了解即可

4.2. 容量调度器(Capacity Scheduler)

🍔是Yahoo开发的多用户调度器,中小企业对并发度要求不高的选择。

  1. 容量调度器特点
    在这里插入图片描述

  2. 容量调度器资源分配算法
    在这里插入图片描述

4.3. 公平调度器(Fair Scheduler)

🍔是Facebook开发的多用户调度器,中大企业对并发度要求高就选这个调度器。
在这里插入图片描述

容量调度器特点相同,但有不同点

  1. 核心调度策略不同
    容量调度器:优先选择资源利用率低的队列
    公平调度器:优先选择对资源的缺额比例大的
  2. 每个队列可以单独设置资源分配方式
    容量调度器:FIFO、DRF
    公平调度器:FIFO、FAIRDRF

🍔公平调度器——缺额
在这里插入图片描述

🍔公平调度器队列资源分配方式
在这里插入图片描述
在这里插入图片描述

🌰举个例子:
在这里插入图片描述
在这里插入图片描述

每个调度器特点

  1. 相同点:支持多队列,可以资源,支持多用户
  2. 不同点:容量调度器优先满足先进来的任务执行,公平调度器的队列里面的任务公平享有队列资源

5. Yarn常用命令

Yarn 状态的查询,除了可以在 hadoop103:8088页面查看外,还可以通过命令操作。
在此之前,先开集群!

5.1. yarn application 查看任务

🍔语法:

#  WordCount 案例
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

# 查询所有application,作用同 `http://hadoop103:8088/cluster`
yarn application -list

在这里插入图片描述

根据Application状态过滤
yarn application -list -appStates 状态(所有状态: ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)

# 查询已结束的任务
yarn application -list -appStates FINISHED

# Kill掉Application
yarn application -kill application_1615277921195_0001

5.2. yarn logs 查看日志(重要)

🍔语法:

# 查询Application日志
yarn logs -applicationId application_6666666666666

# 查询Container日志
yarn logs -applicationId application_66666 -containerId container_666666666666666_666

5.3. yarn applicationattempt 查看尝试运行的任务

🍔语法:

# 列出Application尝试运行的列表,可以查到下面的ApplicationAttempt-Id
yarn applicationattempt -list application_666

# 打印Application尝试运行的状态
yarn applicationattempt -status appattempt_666_666_666

在这里插入图片描述

5.4. yarn container 查看容器

🍔语法:

# 列出Container,只能查到正在运行的,结束的查不到
yarn container -list application_666

# 打印Container状态
yarn container -status application_666

5.5. yarn node 查看节点状态

🍔语法:

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

在这里插入图片描述

5.6. yarn rmadmin 更新配置

🍔语法:

# 加载队列配置,如果我们更改队列配置,无需重启yarn,执行下面命令即可
yarn rmadmin -refreshQueues

在这里插入图片描述

5.7. yarn queue 查看队列

🍔语法:

# 打印队列(default)信息
yarn queue -status default

在这里插入图片描述

6. Yarn 生产环境核心参数配置

🍔参数配置图(yarn-dufault.xml文件中可查):
在这里插入图片描述

二、Yarn案例实操

进行下面操作之前要拍摄 Linux 快照,否则后续的案例,还需要重写准备集群
在这里插入图片描述

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

🌰需求:从1G数据中,统计每个单词出现个数。服务器三台,每台4G内存,4核CPU,4线程(1G / 128m = 8 个 MapTask、1个ReduceTask、1个mrAppMaster,一共开启10个容器,平均每个节点运行3个任务,4/3/3)

👉在yarn-site.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>

<!-- ResourceManager 处理调度器请求的线程数量,默认 50;如果提交的任务数大于 50,可以
增加该值,但是不能超过 3 台 * 4 线程 = 12 线程(去除其他应用程序实际不能超过 8) -->
<property>
    <description>Number of threads to handle scheduler interface.</description>
    <name>yarn.resourcemanager.scheduler.client.thread-count</name>
    <value>8</value>
</property>

<!-- 是否让 yarn 自动检测硬件进行配置,默认是 false,如果该节点有很多其他应用程序,建议
手动配置。如果该节点没有其他应用程序,可以采用自动 -->
<property>
    <description>Enable auto-detection of node capabilities such as memory and CPU.</description>
    <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
    <value>false</value>
</property>

<!-- 是否将虚拟核数当作 CPU 核数,默认是 false,采用物理 CPU 核数 -->
<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-ascores</name>
    <value>false</value>
</property>
<!-- 虚拟核数和物理核数乘数,默认是 1.0 -->
<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,修改为 4G 内存 -->
<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>4096</value>
</property>

<!-- nodemanager 的 CPU 核数,不按照硬件环境自动设定时默认是 8 个,修改为 4 个 -->
<property>
    <description>Number of vcores that can be allocated for containers. This is used by the RM scheduler when allocating resources for containers. This is not used to limit the number of CPUs used by YARN containers. If it is set to -1 and yarn.nodemanager.resource.detect-hardware-capabilities is true, it is automatically determined from the hardware in case of Windows and Linux. In other cases, number of vcores is 8 by default.</description>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>4</value>
</property>

<!-- 容器最小内存,默认 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,修改为 2G -->
<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>2048</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 个,修改为 2 个 -->
<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>2</value>
</property>

<!-- 虚拟内存检查,默认打开,修改为关闭 -->
<property>
    <description>Whether virtual memory limits will be enforced for containers.</description>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</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>

为什么关闭虚拟内存检查?
在这里插入图片描述
JDK8与CentOS7各自为政有Bug

👉xsync yarn-site.xml分发到其他虚拟机上,注意在生产环境下如果集群的硬件资源不一致,要每个NodeManager单独配置

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

生产环境下怎么创建队列
默认一个default队列,不能满足生产要求

  1. 按照框架:hive、spark、flink 每个框架的任务放入指定的队列(企业用的不是特别多)
  2. 按照业务模块创建队列:登录注册、购物车、下单、业务部门1、业务部门2

🍔创建多队列的好处有
1️⃣解耦,防止员工不小心,写递归死循环代码,把所有资源全部耗尽
2️⃣实现任务的降级使用,特殊时期保证重要的任务队列资源充足【业务部门1(重要)➡业务部门2(比较重要)➡下单(一般)➡购物车(一般)➡登录注册(次要)】

2.1. 配置多队列的容量调度器

🌰需求: default队列占总内存的40%,最大资源容量占总资源60%,hive队列占总内存的60%,最大资源容量占总资源80%,配置队列优先级
👉vim /opt/module/hadoop/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>

<!-- 指定 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 队列的资源最大容量占总资源的 80% -->
<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>
	<description>
		The ACL of who can submit applications with configured priority.
      	For e.g, [user={name} group={name} max_priority={priority} hive_priority={priority}]
	</description>
</property>

<!-- 任务的超时时间设置:yarn application -appId appId -updateLifetime Timeout -->
<!-- 如果 application 指定了超时时间,则提交到该队列的 application 能够指定的最大时间不能超过该值。-->
<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-applicationlifetime</name>
    <value>-1</value>
</property>

<!-- 如果 application 没指定超时时间,则用 defaultapplication-lifetime 作为默认值 -->
<property>
	<name>yarn.scheduler.capacity.root.hive.default-application-lifetime
	</name>
	<value>-1</value>
</property>

👉配置好后,分发配置文件,并且重启Yarn或者刷新队列

# 分发
xsync /opt/module/hadoop/etc/hadoop/capacityscheduler.xml

# 重启Yarn(hadoop103的hadoop目录下)
sbin/stop-yarn.sh
sbin/start-yarn.sh
# 或者刷新队列
yarn rmadmin -refreshQueues

2.2.向Hive队列提交任务

🍔在hive队列上测试能否执行任务,由于默认default队列执行,故我们指定hive队列:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename=hive /input /output

👉进入hadoop103web端查看hive队列运行情况

默认的任务提交都是提交到 default队列的。如果希望向其他队列提交任务,需要在Driver中声明conf.set("mapreduce.job.queuename","hive");

2.3. 任务优先级

容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。默认情况,Yarn将所有任务的优先级限制为0,若想使用任务的优先级功能,须开放该限制

🍔修改配置文件:vim /opt/module/hadoop/etc/hadoop/yarn-site.xml,添加以下参数:

<property>
	<name>yarn.cluster.max-application-priority</name>
	<value>5</value>
</property>

👉分发配置,并在Hadoop103上重启 Yarn

xsync yarn-site.xml
sbin/stop-yarn.sh
sbin/start-yarn.sh

👉模拟资源紧张环境,可连续提交以下任务,直到新提交的任务申请不到资源为止

# 除了WordCount还有一个求π的案例
hadoop jar /opt/module/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 5 2000000

👉再次重新提交优先级高(5)的任务

hadoop jar /opt/module/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -D mapreduce.job.priority=5 5 2000000

也可以通过以下命令修改正在执行的任务的优先级yarn application -appID application_1611133087930_0009 -updatePriority 5

3. 公平调度器案例

🌰需求:创建两个队列,分别是 test 和 ygy(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行若未指定队列,test 用户提交的任务到 root.group.test 队列运行,ygy提交的任务到 root.group.ygy 队列运行(注:group 为用户所属组)。

公平调度器的配置涉及到两个文件,一个是 yarn-site.xml,另一个是公平调度器队列分配文件 fair-scheduler.xml(文件名可自定义)

  1. 配置文件参考资料
  2. 任务队列放置规则参考资料

3.1. 配置多队列的公平调度器

🍔配置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>/opt/module/hadoop-3.1.3/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

<?xml version="1.0"?>
<allocations>
 <!-- 单个队列中 Application Master 占用资源的最大比例,取值 0-1 ,企业一般配置 0.1 -->
 <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
 <!-- 单个队列最大资源的默认值 hadoop xiaoqiu 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>
 
 <!-- 增加一个队列 ygy -->
 <queue name="ygy" 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>

👉分发并重启Yarn

# 分发
xsync yarn-site.xml
xsync fair-scheduler.xml

# 重启(hadoop103的hadoop目录下)
sbin/stop-yarn.sh
sbin/start-yarn.sh

重启后,Hadoop103web端查看调度器情况,发现root下有3个调度器

3.2. 测试提交任务

情况1️⃣:提交任务时指定队列,按照配置规则,任务会到指定的 root.test 队列

hadoop jar /opt/module/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=root.test 1 1

情况2️⃣:提交任务时不指定队列,按照配置规则,任务会到 root.ygy队列

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

Hadoop103web端查看该任务在那个队列执行

4. Yarn的Tool接口案例

hadoop jar wc.jar com.ygy.mapreduce.wordcount.WordCountDriver -Dmapreduce.job.queuename=root.hadoop /input /output
我们期望可以动态传参,结果报错,误认为指定的队列是第一个输入参数。

🌰需求:自己写的程序也可以动态修改参数。编写 Yarn 的 Tool 接口。
👉新建 Maven 项目 YarnDemo,pom 如下:

<dependencies>
 	<dependency>
		 <groupId>org.apache.hadoop</groupId>
		 <artifactId>hadoop-client</artifactId>
		 <version>3.1.3</version>
	 </dependency>
</dependencies>

👉新建 com.ygy.yarn 包名,并创建类 WordCount 并实现 Tool 接口:

import org.apache.hadoop.util.Tool;

public class WordCount  implements Tool {

    private Configuration conf;

	// 核心驱动(conf 需要传入)
    @Override
    public 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;
    }

    @Override
    public void setConf(Configuration conf) {
        this.conf = conf;
    }

    @Override
    public Configuration getConf() {
        return conf;
    }
    
	// 内部类mapper
    public static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        private Text OutKey = new Text();
        private IntWritable outValue = new IntWritable(1);
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            // 1 获取一行
            String s = value.toString();
            // 2 切割
            String[] words = s.split(" ");
            // 3 循环写出
            for (String word : words) {
                // 封装
                OutKey.set(word);
                // 写出
                context.write(OutKey, outValue);
            }
        }
    }
    
    // 内部类reducer
    public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable outValue = new IntWritable();
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            // 累加
            for (IntWritable value : values) {
                sum += value.get();
            }
            outValue.set(sum);
            //写出
            context.write(key,outValue);
        }
    }
}

WordCountDriver.java

public class WordCountDriver {
    private static Tool tool;
    public static void main(String[] args) throws Exception {
        // 1. 创建配置文件
        Configuration conf = new Configuration();
        // 2. 判断是否有 tool 接口
        switch (args[0]){
            case "wordcount":
                tool = new WordCount();
                break;
            default:
                throw new RuntimeException(" No such tool: "+ args[0]);
        }
        // 3. 用 Tool 执行程序
        // Arrays.copyOfRange 将老数组的元素放到新数组里面
        int run = ToolRunner.run(conf, tool,Arrays.copyOfRange(args, 1, args.length));
        System.exit(run);
    }
}

👉在 HDFS 上准备输入文件,假设为/input 目录,向集群提交该 Jar 包

yarn jar YarnDemo.jar com.ygy.WordCountDriver wordcount /input /output

👉注意此时提交的 3 个参数,第一个用于生成特定的 Tool,第二个和第三个为输入输出目录。此时如果我们希望加入设置参数,可以在 wordcount 后面添加参数,例如:

yarn jar YarnDemo.jar com.ygy.WordCountDriver wordcount -Dmapreduce.job.queuename=root.xiaoqiu /input /output1

注意
以上操作全部做完过后,快照回去或者手动将配置文件修改成之前的状态,因为本身资源就不够,分成了这么多,不方便以后测试


其他

虚拟内存,是内存和磁盘交互的第二个媒介。虚拟内存是指把磁盘的一部分作为假想内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个完整的地址空间),但是实际上,它通常被分割成多个物理碎片,还有部分存储在外部磁盘管理器上,必要时进行数据交换。通过借助虚拟内存,在内存不足时仍然可以运行程序。

✍下一节Hadoop_生产调优手册!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 无效的 hadoop_yarn_home 是指 Hadoop 配置中的 YARN_HOME 环境变量设置不正确或不存在。YARN_HOME 是指向 YARN 安装目录的路径,如果该路径不存在或设置不正确,则会导致 Hadoop 无法启动 YARN 服务。需要检查 YARN_HOME 环境变量是否正确设置,并确保该路径下存在 YARN 相关的文件和目录。 ### 回答2: invalid hadoop_yarn_home是指在Hadoop程序运行时未设置或设置错误的YARN Home环境变量。YARN是Apache Hadoop的一个资源调度和管理系统,它有一个YARN Home目录来存储它所需的文件和配置。 如果出现invalid hadoop_yarn_home错误,可能会导致Hadoop程序无法正常运行或找不到必要的资源文件。为了解决这个问题,可以按照以下步骤进行作: 1. 确定正确的YARN Home目录,例如/opt/hadoop/yarn。 2. 通过设置环境变量来指定YARN Home目录。可以在~/.bashrc或/etc/environment配置文件中添加以下行: export HADOOP_YARN_HOME=/opt/hadoop/yarn 3. 重新启动终端,使新的环境变量生效。 如果问题仍然存在,请检查YARN Home目录的权限和访问性。在一些情况下,可能需要更改目录的权限或所有者来解决问题。 总之,通过正确设置YARN Home环境变量,可以解决invalid hadoop_yarn_home问题,并确保Hadoop程序的正常运行。 ### 回答3: invalid hadoop_yarn_home 错误通常出现在启动 Hadoop 集群时。 首先,Hadoop YARN 是 Hadoop 的一个子模块,它是 Hadoop 用于管理和调度集群资源的框架。而 hadoop_yarn_home 是 Hadoop YARN 的根目录路径。 当您启动 Hadoop 集群时,Hadoop 会检查一些必要的参数是否正确设置,其中包括环境变量设置是否正确。如果您没有正确设置 hadoop_yarn_home 环境变量,则会出现“invalid hadoop_yarn_home”错误。 为了解决此错误,您需要将 hadoop_yarn_home 环境变量设置为正确的值。具体来说,要设置 hadoop_yarn_home 环境变量,您可以按照以下步骤进行作: 1. 打开 Hadoop 的配置文件,通常是 $HADOOP_HOME/etc/hadoop/hadoop-env.sh。 (HADOOP_HOME 表示 Hadoop 的安装路径) 2. 找到以下语句: # export HADOOP_YARN_HOME=${HADOOP_PREFIX}/share/hadoop/yarn 3. 去掉前面的注释符号(#),并将默认的 HADOOP_YARN_HOME 路径替换为正确的路径,例如: export HADOOP_YARN_HOME=/usr/local/hadoop-2.7.3/share/hadoop/yarn 4. 保存文件并退出。 5. 在终端中执行命令:source $HADOOP_HOME/etc/hadoop/hadoop-env.sh。这将重新加载您的配置文件。 6. 重新启动 Hadoop。如果一切正确设置,则应该可以启动 Hadoop 集群而不会再出现“invalid hadoop_yarn_home”错误。 需要注意的是,在设置 hadoop_yarn_home 环境变量时,您需要确保指定的路径指向正确的 Hadoop YARN 的根目录。如果错误指定了路径,则会导致启动 Hadoop 集群失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值