mapreduce(2)--自定义combiner,指定InputFormat,在map端进行join,多个mr编程
一.准备工作
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进行实现两个表的join操作(问题描述及详解都在代码注释中)
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/rjoin
五.为了避免数据倾斜,在map端进行两个表的join操作(问题描述及详解都在代码注释中)
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/mapsideJoin
六.使用两个mr程序对文件内容做索引(问题描述及详解都在代码注释中)
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/inverseIndex
第一阶段的结果
第二阶段的结果
七.使用两个mr程序寻找明星之间共同粉丝(问题描述及详解都在代码注释中)
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/fensi
第一阶段输出的结果
第二阶段输出结果(部分内容)
八.自定义GroupingComparatorClass来实现reducetask对数据进行分组,每组调用一次reduce函数
自定义PartitionerClass来指定reducetask数量
github链接:https://github.com/gulu2016/STBigData/tree/master/src/main/java/cn/gulu/bigdata/mr/secondarysort