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>
View Code

 二.使用自定义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

三.指定InputFormatCombineTextInputFormat的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

转载于:https://www.cnblogs.com/ManchesterCityCoder/p/10804595.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值