MapReduce执行过程以及优化

目录

一:MR执行过程-map阶段

二:MR执行过程-reduce阶段

三:mapreduce优化总结


一:MR执行过程-map阶段

map任务处理

1 框架使用InputFormat类的子类把输入文件(夹)划分为很多InputSplit,默认,每个HDFS的block块对应一个InputSplit。通过RecordReader类,把每个InputSplit解析成一个个。默认,框架对每个InputSplit中的每一行,解析成一个。

默认一个block块对应一个split块(可以手动改)

2 框架调用Mapper类中的map(...)函数,map函数的形参是键值对,输出是键值对。一个InputSplit对应一个map task。程序员可以覆盖map函数,实现自己的逻辑。

3(假设reduce存在)框架对map输出的进行分区。不同的分区中的由不同的reduce task处理。默认只有1个分区。

(假设reduce不存在)框架对map结果直接输出到HDFS中。

4 (假设reduce存在)框架对每个分区中的数据,按照k2进行排序、分组。分组指的是相同k2的v2分成一个组。注意:分组不会减少数量。

5 (假设reduce存在,可选)在map节点,框架可以执行reduce归约。

6 (假设reduce存在)框架会对map task输出的写入到linux 的磁盘文件中。

至此,整个map阶段结束

二:MR执行过程-reduce阶段

reduce任务处理

1 框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程称作shuffle。

2 框架对reduce端接收的[map任务输出的]相同分区的数据进行合并、排序、分组。

3 框架调用Reducer类中的reduce方法,reduce方法的形参是,输出是键值对。一个调用一次reduce函数。程序员可以覆盖reduce函数,实现自己的逻辑。

4 框架把reduce的输出保存到HDFS中。

至此,整个reduce阶段结束。

例子:实现WordCountApp

三:mapreduce优化总结

1,通过修改map的切片大小控制map数据量(尽量和block大小保持一致)

并不是map越多越好,根据集群资源 (可以在配置文件中改 /hadoop下的conf)

set mapred.max.split.size=256000000

2,合并小文件。因为一个文件会至少生成一个map

可以将小文件合并一起做一个map任务

3,避免数据倾斜(key的分布不均匀)

避免某一部分数据过大 可以手动给key加标记(时间戳或反时间戳)

4,combine操作

map端的 预聚合 map端的reduce 代码与reduce一样

5,mapjoin操作

小表广播 将小文件放在内存中

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值