大数据-----------shuffle过程的优化:combiner合并,compress压缩(五)

本文探讨了MapReduce中shuffle过程的优化方法,包括使用combiner进行预合并减少reduce负载,以及利用压缩技术如snappy、lzo、lz4减少磁盘和网络IO,提升整体处理效率。

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

shuffle过程的优化

combiner合并

在map阶段提前进行了一次合并,一般来讲等同于提前执行了reduce操作
好处:可以降低reduce的压力
在map阶段的进行合并是并行的(分布式的)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:并不是所有的程序都适合combiner:测试
设置combiner之和和之后的结果要一致,不能因为性能优化导致结果不对,A + (B +C) = (A+B) + C

compress压缩

大大减少了磁盘IO以及网络IO

MapReduce有很多地方都可以压缩

输入的就是一个压缩文件

map shuffle中合并成一个大文件,对该文件进行压缩,reduce过来取数据就是压缩之后的数据

reduce输出

Hadoop常见的压缩格式

检查本地库支持哪些压缩:bin/hadoop checknative

修改压缩库,只需要替换native包(在hadoop-2.7.3/lib里)即可

常用的压缩格式:snappy,lzo,lz4

Hadoop中设置压缩

输入: 一般不配置

map的中间结果:

mapreduce.map.output.compress =true;
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.Lz4Codec 

压缩方式的寻找:DefaultCodec → 找打该类的目录 → 其他压缩类和他在同一个目录下

reduce输出:

mapreduce.output.fileoutputformat.compress =true;
mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.Lz4Codec 

配置方式:
方式一:在main方法中Configuration
在这里插入图片描述
方式二:在配置文件中
全局修改,所有MapReduce都生效

方式三:运行的时候通过自定义配置
bin/yarn jar xxx.jar -DXX=yy -Daa=bb MianClass input_path output_Path

检查是否配置成功:
方式一:
hpsk01.huadian.com:50070 → Configuration → 查看对应配置参数
配置前:
在这里插入图片描述
配置后:
在这里插入图片描述
方拾二:查看计数器
配置前:
在这里插入图片描述
配置后:
在这里插入图片描述

<think>嗯,用户现在问的是MapReduce的过程,我之前已经回答过Flink的背压和反压机制,现在需要切换到MapReduce。首先,得确认用户对MapReduce的了解程度,可能是个新手,所以需要从基础讲起。 MapReduce是Hadoop的核心,用于大规模数据处理的编程模型。用户可能想知道它的工作原理,比如各个阶段和如何分布式处理数据。需要分步骤解释,确保结构清晰。 首先,MapReduce分为Map阶段、Shuffle和Sort阶段、Reduce阶段。要详细说明每个阶段的作用。比如,Map处理输入数据,生成键值对;Shuffle阶段将相同key的数据送到同一个Reducer;Reduce进行汇总。 需要注意用户可能的疑问点,比如为什么需要Shuffle和Sort,或者Combiner的作用。在优化方案里,Combiner可以减少数据传输,但需要合适的情况才能使用。此外,数据倾斜是常见问题,可能需要举例说明如何解决,比如自定义Partitioner。 用户可能对实际应用案例感兴趣,比如词频统计,这样能帮助理解流程。要给出具体的步骤,从输入拆分到最终输出,让例子具体易懂。 还要考虑用户可能的进阶问题,比如优化策略,这里可以提到压缩、选择合适的Writable类型、调整任务数量等。需要解释每个优化手段的原因和适用场景。 最后,总结MapReduce的特点,比如易于扩展、适合批处理等,同时指出缺点,比如实时性差,这样用户能全面了解。 确保使用中文,避免术语混淆,语言简洁明了。检查是否有遗漏的环节,比如错误处理或者任务调度,但根据问题范围,可能不需要深入这些细节。保持回答结构清晰,逐步引导用户理解整个过程。</think>### MapReduce核心过程解析 MapReduce是一种分布式计算模型,其核心思想是**分而治之**,通过将大数据任务拆解为**Map(映射)**和**Reduce(归约)**两个阶段实现并行处理。以下是详细执行流程: --- #### 一、整体执行流程 ``` 输入分片 → Map阶段 → Shuffle & Sort → Reduce阶段 → 结果输出 ``` --- #### 二、分阶段详解 ##### 1. **输入分片(Input Split)** - **物理切分**:将输入文件(如HDFS上的1GB文本)切分为固定大小的块(默认128MB) - **逻辑划分**:每个分片对应一个Map任务(例如1GB文件被分为8个Map任务) - *特点*:分片不包含实际数据,仅存储元数据(文件路径、偏移量等) ##### 2. **Map阶段** - **处理单元**:每个Map任务处理一个输入分片 - **核心操作**: ```java // 伪代码示例 map(key, value) { // 业务逻辑(如词频统计中的分词) for word in value.split(): emit(word, 1) // 输出中间键值对 } ``` - **输出缓存**:Map结果先写入环形内存缓冲区(默认100MB),达到阈值后溢写(spill)到磁盘 ##### 3. **Shuffle & Sort** *连接Map和Reduce的关键阶段* - **分区(Partitioning)**: 使用哈希函数决定数据归属哪个Reduce任务 ```java partition = hash(key) % numReduceTasks ``` - **排序(Sorting)**: 每个分区内的数据按Key排序(默认字典序) - **Combiner(可选优化)**: 在Map端本地执行Reduce逻辑,减少网络传输 ```java // 例如在词频统计中预聚合 combine(key, values) { emit(key, sum(values)) } ``` ##### 4. **Reduce阶段** - **数据拉取**:每个Reduce任务从所有Map节点拉取对应分区的数据 - **归并排序**:对来自不同Map的数据进行二次排序 - **核心操作**: ```java reduce(key, values) { // 业务逻辑(如词频累加) emit(key, sum(values)) } ``` ##### 5. **结果输出** - 结果写入HDFS或其他存储系统 - 每个Reduce任务生成一个输出文件(如`part-r-00000`) --- #### 三、关键组件协作 | 组件 | 作用 | |------------------|----------------------------------| | **JobTracker** | 调度任务,监控节点状态(Hadoop 1.x) | | **ResourceManager** | 资源管理(YARN架构下) | | **NodeManager** | 执行具体任务容器 | | **TaskTracker** | 执行Map/Reduce任务(Hadoop 1.x) | --- #### 四、优化策略 1. **数据倾斜处理** - 自定义Partitioner:将热点Key分散到不同Reduce - 增加Reduce任务数量(`job.setNumReduceTasks(10)`) 2. **压缩中间数据** - 启用Map输出压缩(`mapreduce.map.output.compress=true`) 3. **内存调优** - 增大环形缓冲区(`mapreduce.task.io.sort.mb=256`) 4. **合并小文件** - 使用`CombineFileInputFormat`减少Map任务数 --- #### 、典型案例:词频统计 1. **输入分片**:将《哈姆雷特》文本切分为3个分片 2. **Map阶段**: - 输入:`("line1", "To be or not to be")` - 输出:`("To",1), ("be",1), ("or",1), ("not",1), ("to",1), ("be",1)` 3. **Shuffle阶段**:相同单词聚合并排序 4. **Reduce阶段**: - 输入:`("be", [1,1])` - 输出:`("be", 2)` --- ### 总结 MapReduce通过**分片并行处理**和**键值归约**实现海量数据计算,其核心价值在于: 1. **自动并行化**:开发者只需关注业务逻辑 2. **容错机制**:失败任务自动重新调度 3. **线性扩展**:增加节点即可提升计算能力 *局限性*:不适合迭代计算和实时处理,此时需选择Spark/Flink等框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值