hadoop下map-reduce模型编程的一些理解

2017-11-02 22:40:05

以下讨论均是基于hadoop mapreduce编程:



1.如何对mapreduce计算结果进行分组??? 比如有多个省份每个省份为一个结果集


先看看以前的mapreduce应用:
以前的mapreduce均为多个map一个reduce,一个reduce对应一个结果文件,
比如之前写的wordCount,就是多个map来进行统计计算,计算后的结果先缓存到context中,计算完之后,在调用reduce,
但是此时只有一个reduce来统计,reduce会统计每一个map(reduce中只写了统计一个map的逻辑),此时的map一个key中
对应多个value,reduce统计一个map后就将结果放入context中,此时的放入顺序按key来排序,统计完后就把context中的
统计结果写入到一个统计文件中
那么现在如果要实现分组又应该怎样做呢??
需要多个reduce,每个reduce产生一个结果文件,放到磁盘中
分组的实现机制(猜测):在所有的map计算完后,先只用一个reduce统计完所有map,放到context中,然后对此时的map进行分组,依据是key(此时map的value有多个),
分组后,将这些map分配到不同的reduce上去并发执行,产生多个结果文件
实现步骤:
1 map和reduce的逻辑和之前的不变
2 编写一个partition类继承Partitioner,覆盖其中的方法int getPartition(KEY key, VALUE value, int arg2)
该方法的大概意思是我们需要事先有一个分类,然后根据方法传进来的key(或者value:不太确定,因为依据之前的猜测是计算完map后将map分配到不同的reduce,那么分组依据只能是key,因为此时value有多个)
来判断该结果属于哪一个分类,至于返回的结果是int,也就是不同的分组对应不同的数字,这个标号就是结果文件的标号
3 在jobRunner中需要在job对象中配置
job.setPartitioner(Class partitioner); // 设置分组类的class对象
// 设置reduce的个数,原则上和分组的个数对应,但是如果我们多设置了,那么会产生空结果文件,如果少设置了(大于1个)那么会报错
// 设置一个时不会报错,因为默认就是一个,只是此时分组相等于一个
job.setNumReduceTasks(int num); 




2.对mapreduce计算结果排序


    这个实际就是对key排序,在一个reduce产生一个结果文件之前,需要一个个统计每个map,然后单个map的统计结果放入到context中,reduce
计算完后就写出结果文件,需要排序结束对统计每个map后产生的一个统计结果进行排序,默认是按照key来排序的,如果key是字符串,就按照字符串的compare方法排序,如果是我们自定义的对象,那么我们需要让自定义对象实现compareable接口,覆盖compareTo方法,那么context中
的结果就会根据compareTo方法来比较排序,最后输出结果文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值