大数据 - MapReduce编程总结 -BH3

MapReduce编程总结

mapreduce在编程的时候,基本上一个固化的模式,没有太多可灵活改变的地方,除了以下几处:

  1. 输入数据接口:InputFormat —> FileInputFormat(文件类型数据读取的通用抽象类) DBInputFormat (数据库数据读取的通用抽象类)
    默认使用的实现类是: TextInputFormat job.setInputFormatClass(TextInputFormat.class)
    TextInputFormat的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为value返回

  2. 逻辑处理接口: Mapper
    完全需要用户自己去实现其中 map() setup() clean()

  3. map输出的结果在shuffle阶段会被partition以及sort,此处有两个接口可自定义:

    Partitioner,默认实现 HashPartitioner,逻辑是 根据keynumReduces来返回一个分区号; key.hashCode()&Integer.MAXVALUE % numReduces

    通常情况下,用默认的这个HashPartitioner就可以,如果业务上有特别的需求,可以自定义

    Comparable,当我们用自定义的对象作为key来输出时,就必须要实现WritableComparable接口,override其中的compareTo()方法

  4. reduce端的数据分组比较接口 : Groupingcomparator

    reduceTask拿到输入数据(一个partition的所有数据)后,首先需要对数据进行分组,其分组的默认原则是key相同,然后对每一组kv数据调用一次reduce()方法,并且将这一组kv中的第一个kvkey作为参数传给reducekey,将这一组数据的value的迭代器传给reduce()values参数

    利用上述这个机制,我们可以实现一个高效的分组取最大值的逻辑:
    自定义一个bean对象用来封装我们的数据,然后改写其compareTo方法产生倒序排序的效果
    然后自定义一个Groupingcomparator,将bean对象的分组逻辑改成按照我们的业务分组id来分组(比如订单号)
    这样,我们要取的最大值就是reduce()方法中传进来key

  5. 逻辑处理接口:Reducer
    完全需要用户自己去实现其中 reduce() setup() clean()

  6. 输出数据接口:OutputFormat —> 有一系列子类 FileOutputformat DBoutputFormat
    默认实现类是TextOutputFormat,功能逻辑是: 将每一个KV对向目标文本文件中输出为一行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值