一.准备工作
1.需求
- 在wordcount程序中使用自定义combiner
- 解析mapreduce的流程
2.环境配置
(1)hadoop为本地模式
(2)pom文件代码如下
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> </dependencies>
二.使用自定义combiner的wordcount程序
1.combiner介绍
- combiner程序可以在mapper程序输出结果的时候对每个reduce分区进行汇总,由于在wordcount中combiner做的事情和reducer做的事情是一样的,所以在wordcount中直接使用WordcountReducer类作为combiner
- combiner使用需要注意业务场景,如果reduce是对每个分区求平均数,那么就不适合中间使用combiner,这是因为局部汇总结果会导致最终结果不一致。
2.使用自定义combiner的wordcount程序
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/wordcountWithCombiner
三.指定InputFormat为CombineTextInputFormat的wordcount程序
1.为什么要使用指定InputFormat为CombineTextInputFormat
在没有指定InputFormat情况下,默认128MB一个切片,不足128MB的页作为一个切片,一个切片对应一个MapTask。这样会产生一个问题,如果有大量的小文件,那么就会有大量的MapTask。为了解决这个问题,可以指定InputFormat为CombineTextInputFormat,它可以合并多个小文件到一个切片。
2.指定InputFormat为CombineTextInputFormat的wordcount程序
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/wordcountWithCombineTextInputFormat
3.效果对比
在没有使用CombineTextInputFormat的情况下,处理5个小文件会分为5个切片,对应地,有5个MapTask进行处理。
在使用CombineTextInputFormat之后,同样处理5个小文件,这5个小文件会被划分成同一个切片,这样就会启动一个MapTask。
四.mr流程解析
原文地址:https://www.cnblogs.com/ManchesterCityCoder/p/10804595.html
时间: 2024-11-08 22:04:34