MR优化总结

优化前
1.熟知业务要求
2.熟知数据分布状态(是否倾斜、是否是多个小文件等),可以使用采样来了解数据
通用型优化策略
1.文件存储格式
使用更加优化的格式的文件,例如Parquet、ORC,综合来说,ORC最优。
2.文件压缩
可以在mr各阶段启用压缩,例如:数据块可以被压缩(reduce输出可以被压缩)、map输出数据可以被压缩(减少shuffle过程中传输的数据量)
3.shuffle优化
核心思想:减少磁盘IO。可以通过调节一下几个方面来达到效果:
1.增加环形缓冲区大小
2.增大merge过程一次可以合并的溢写文件的数量(注意:量力(内存)而行)
3.增大溢写的第一级门槛
4.在能使用Combiner的业务场景下,尽可能的使用Combiner
5.合理设置Combiner的阈值
6.map输出的k、v尽量小
专用型优化策略
减少不必要的消耗
1.使用更加优化的数据格式文件,例如ORC
2.map端join(省去shuffle过程)
3.countall 或 topn场景下合理使用cleanup方法(减少shuffle过程中的数据传输量)
4.排序操作尽量使用shuffle内置的排序机制而不要自己手动排序
合理进行任务分配
数据本身不均衡
数据倾斜
通过自定义业务k,均分分散倾斜的数据,要实现同等效果还可以自定义Partitioner
大量小文件
1.当MR程序的输入是一堆小文件时,可以先将小文件合并,然后在再进行处理
2.使用Uber模式
数据本身均衡
1.合理设置ReduceTask的数量,假定map总输出的键值对的大小是10GB(并且去重后的key的数量远大于ReduceTask的数量),而一个ReduceTask所用的Continer的内存为1GB,那么合理的ReduceTask的数量为10÷(1*0.7)≈15(这里需要采用进1法);
2.为具体的任务设置合适的Continer大小,无论是MapTask还是ReduceTask,只要是cpu密集型的,其所使用的Continer就应该由较多的cpu和合适的内存所组成。同样的,如果任务是IO密集型的,其所使用的Continer就应该改由合适的cpu和较大的内存所组成。这个一般不全局调节。
优化最佳实践
在这里插入图片描述在这里插入图片描述

MapReduce是用于大规模数据集并行运算的编程模型,采用分而治之思想,将任务分发到集群多个节点并行计算后合并结果,其相关任务调度等由框架完成,无需编程人员关心[^1]。 MapReduce任务包含map和reduce两个处理阶段,分别对应Map Task和Reduce Task。HDFS以block存储数据,MapReduce处理单位是split,其划分由用户决定,split数量决定Map Task数目,每个split由一个Map Task处理。Map Task将split解析成key/value对,调用map()函数处理,结果存于本地磁盘并分成若干partition,每个partition由一个Reduce Task处理。Hadoop在存储输入数据的节点运行map任务可实现“数据本地化优化”[^1]。 Reduce阶段是MapReduce程序运行的第二阶段,目的是合并汇总Map阶段结果,该阶段可选。负责此阶段计算的是ReduceTask,一个Job可设置启动多个ReduceTask并行运行,每个ReduceTask产生一个结果[^2]。 MapReduce过程包含input、split、map、shuffle、reduce五个步骤。Reducer将分好组的数据作为输入,为每个键对应分组执行reduce函数,其输入是map端输出,输出的(k, v)可自定义。Reducetask并行度影响job执行并发度和效率,其数量可手动设置,而maptask并发数由切片数决定[^3][^4]。 以下是一个Reduce类示例: ```java package org.example; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordCountReduce extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable outV=new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum=0; // 统计出现次数 for(IntWritable val:values){ sum=sum+val.get(); } outV.set(sum); // 写出 context.write(key, outV); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值