MapReduce实践及Yarn资源调度

本文介绍了MapReduce的思想,Hadoop MapReduce的设计及编程规范,通过WordCount实例展示了MapReduce的使用。同时,详细讲解了Yarn的资源调度,包括FIFO Scheduler、Capacity Scheduler和Fair Scheduler的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MapReduce介绍

1.理解MapReduce思想

​ MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。

Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reduce(规约)负责“合”,即对map阶段的结果进行全局汇总。

这两个阶段合起来正是MapReduce思想的体现。

在这里插入图片描述

还有一个比较形象的语言解释MapReduce:

我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。

现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。

2.Hadoop MapReduce设计构思

MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。

既然是做计算的框架,那么表现形式就是有个输入(input),MapReduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output)。

如何对付大数据处理:分而治之

l 构建抽象模型:Map和Reduce

MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型。

Map: 对一组数据元素进行某种重复式的处理;

Reduce: 对Map的中间结果进行某种进一步的结果整理。

MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:

map: (k1; v1) → [(k2; v2)]

reduce: (k2; [v2]) → [(k3; v3)]

在这里插入图片描述

3.MapReduce编程规范及示例编写

编程规范

mapReduce编程模型的总结:

MapReduce的开发一共有八个步骤其中map阶段分为2个步骤,shuffle阶段4个步骤,reduce阶段分为2个步骤

Map阶段2个步骤

第一步:设置inputFormat类,将我们的数据切分成key,value对,输入到第二步

第二步:自定义map逻辑,处理我们第一步的输入数据,然后转换成新的key,value对进行输出

shuffle阶段4个步骤(了解,可以全部不用管)

第三步:对输出的key,value对进行分区

第四步:对不同分区的数据按照相同的key进行排序

第五步:对分组后的数据进行规约(combine操作),降低数据的网络拷贝(可选步骤)

第六步:对排序后的额数据进行分组,分组的过程中,将相同key的value放到一个集合当中

reduce阶段2个步骤

第七步:对多个map的任务进行合并,排序,写reduce函数自己的逻辑,对输入的key,value对进行处理,转换成新的key,value对进行输出

第八步:设置outputformat将输出的key,value对数据进行保存到文件中

4.WordCount实例

4.1准备数据并上传

cd /opt/servers
vim wordcount.txt

hello,world,hadoop
hive,sqoop,flume,hello
kitty,tom,jerry,world
hadoop

hdfs dfs -mkdir /wordcount/input
hdfs dfs -put wordcount.txt /wordcount/input

4.2测试官方案例

hadoop jar /opt/servers/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /wordcount/input /wordcount/output

4.3定义一个mapper类

public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> {
   
     @Override
     public void map(LongWritable key, 
<think>嗯,用户这次提出了一个关于HadoopYARN如何管理MapReduce资源分配机制的问题。从对话历史看,用户似乎是个有一定Hadoop基础的技术人员,之前已经了解过MapReduce参数调优,现在想深入理解底层资源调度原理。用户可能正在搭建或优化Hadoop集群,尤其关注资源分配机制是否合理。考虑到ta之前研究过MapReduce参数,现在转向YARN层面,说明学习路径是从应用层向架构层深化。这个问题其实包含三个子维度:资源申请机制、调度策略、状态管理。关于YARN的架构需要重点解释RM和NM的分工。记得之前回复时提到过ApplicationMaster的作用,这次需要更强调它在资源谈判中的角色。用户提供的参考资料[1][4]都提到了yarnjar命令行提交方式,这是个很好的切入点,可以结合应用提交过程说明资源申请流程。内存和CPU的核心参数必须讲清楚,特别是yarn.scheduler.minimum-allocation-mb这类关键配置的实际影响。用户引用的示例中出现了多次mapreduceyarn的配置项,说明ta对参数敏感,回答时要突出配置项与实际资源分配的关系。调度策略部分需要简明区分Capacity和Fair两种模式。用户没有指定集群规模,但引用[5]提到求PI程序用了3个map任务,可能在小规模测试,因此可以补充说明不同规模下的策略选择建议。最后的状态管理环节,用户可能最关心如何通过YARN界面定位资源问题。考虑到ta之前问过调优指标,应该把资源监控和任务失败后的重试机制关联起来解释,比如超过memory-mb分配时的容器释放过程。生成的相关问题要引导用户向更深层次思考:资源配置和实际物理资源的匹配关系、不同计算框架的资源隔离、以及日常运维中最常见的资源耗尽问题排查方法。这些问题都是用户理解机制后自然会产生的新疑问。</think> Hadoop YARN 管理 MapReduce 资源分配的核心机制分为以下层级,其资源分配流程如下: --- ### 一、YARN 架构核心组件的作用 1. **ResourceManager (RM)** - **全局资源仲裁者**:负责整个集群的资源分配,管理 `NodeManager` (NM) 上报的资源状态。 - **调度策略**:通过 `CapacityScheduler` 或 `FairScheduler` 实现多队列资源分配,计算公式: $$ \text{队列资源上限} = \text{集群总资源} \times \text{队列容量占比} $$ 2. **NodeManager (NM)** - **节点资源代理人**:定期向 RM 汇报节点资源(CPU、内存、磁盘),并执行 RM 下发的容器启停命令。 - **资源隔离**:通过 Linux `cgroups` 限制容器资源使用,确保物理资源不超限[^1]。 3. **ApplicationMaster (AM)** - **应用级调度器**:由 MapReduce 作业的 AM 向 RM 动态申请资源,计算公式: $$ \begin{cases} \text{Map 容器数} = \lceil \frac{\text{输入数据大小}}{\text{mapreduce.input.fileinputformat.split.maxsize}} \rceil \\ \text{Reduce 容器数} = \text{mapreduce.job.reduces} \end{cases} $$ - **生命周期管理**:监控任务执行状态,失败时发起重试或向 RM 重新申请资源[^4]。 --- ### 二、MapReduce 资源申请流程 ```mermaid graph TD A[提交作业] --> B(Client 上传 JAR 文件到 HDFS) B --> C[向 RM 申请 AM 容器] C --> D[RM 分配 AM 容器并启动 AM] D --> E[AM 向 RM 请求 Map/Reduce 容器] E --> F[RM 调度空闲资源分配容器] F --> G[NM 启动容器执行 Task] G --> H[AM 监控 Task 状态] ``` --- ### 三、关键资源配置参数 | **资源类型** | **参数** | **作用** | **示例值** | |--------------|-------------------------------|--------------------------|------------| | **内存** | `yarn.scheduler.minimum-allocation-mb` | 单容器最小内存 | 1024 MB | | | `mapreduce.map.memory.mb` | Map 容器内存上限 | 2048 MB | | **CPU** | `yarn.scheduler.minimum-allocation-vcores` | 单容器最小 vCore | 1 | | | `mapreduce.map.cpu.vcores` | Map 任务 vCore 数 | 2 | | **并行度** | `mapreduce.job.maps` | Map 任务数上限 | 根据输入数据自动计算 | | | `mapreduce.job.reduces` | Reduce 任务数 | 自定义(默认 1) | > ⚠️ 参数约束条件: > $$ > \text{mapreduce.[map|reduce].memory.mb} \leq \text{NodeManager 可用物理内存} > $$ --- ### 四、调度策略与资源隔离 1. **Capacity Scheduler** - 资源分配公式: $$ \text{队列实际资源} = \min \left( \text{队列容量}, \text{空闲资源} \right) $$ - **弹性队列**:支持优先级抢占(需配置 `yarn.scheduler.capacity.maximum-am-resource-percent`) 2. **Fair Scheduler** - 基于权重公平分配资源,保证小作业快速完成。 --- ### 五、资源监控与故障处理 1. **资源超限处理** - 容器内存超限 ➜ NM 强制终止容器 ➜ AM 重新申请资源并重试任务(最多 `mapreduce.map.maxattempts` 次) 2. **资源利用率监控** - 通过 YARN Web UI 观察: - **Memory Utilization**:容器内存使用率 - **vCore Utilization**:CPU 核心利用率 --- ### 六、优化实践 1. **避免资源碎片**:设置 `yarn.scheduler.minimum-allocation-mb` 接近常用任务内存值(如 2GB)。 2. **队列划分**:按业务重要性隔离队列,防止大作业饿死小作业[^4]。 3. **动态调整**:使用 `DistributedShell` 测试资源分配策略后再部署生产作业[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗人在流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值