Hadoop(三)自定义combiner和partitioner

Hadoop提供了缺省的Partition来完成map的输出向reduce分发处理。有时也需要自定义partition来将相同key值的数据分发到同一个reduce处理,为了减少map过程输出的中间结果键值对的数量,降低网络数据通信开销,用户也可以自定制combiner过程。

自定制Partition过程:

在mapreduce中,partition用于决定Map节点输出将被分到哪个Reduce节点,MapReduce提供的缺省Partition是HashPartition,他根据每条数据的主键值进行hash操作,获得一个hash码,然后对当前的分区数量进行取模计算,以此决定分发到哪个reduce节点。用户自定制的Partition,重载了getPartition()方法,对于上篇的倒排索引复合键将<itr.nextToken()+":"+split.getPath().toString().substring(splitIndex),"1">拆开.代码:

[cpp]  view plain copy
  1. public class NewPartition extends HashPartitioner<Text,Text>{  
  2.             String keyinfo;  
  3.             public int getPartition(Text key,Text value,int numReducerTasks){  
  4.                 keyinfo = key.toString().split(":")[0];  
  5.                 return super.getPartition(new Text(keyinfo), value, numReducerTasks);  
  6.             }  
  7.         }  
自定制的partition使用:

job.setPartitionClass(NewPartition.class);
而用户自定制的combiner,借鉴上篇的倒排索引的部分代码:

[java]  view plain copy
  1. public static class combiner extends Reducer<Text,Text,Text,Text>{  
  2.         private Text info = new Text(); //为了拆分 key值 准备存储新的value值  
  3.         public void reduce(Text key,Iterable<Text>values,Context context) throws IOException, InterruptedException{  
  4.             int sum = 0;  
  5.             for(Text val:values){  
  6.                 sum += Integer.parseInt(val.toString());  
  7.             }  
  8.             int splitIndex = key.toString().indexOf(":");  
  9.             info.set(key.toString().substring(splitIndex+1)+":"+sum);   //新的value值  
  10.             key.set(key.toString().substring(0, splitIndex));  
  11.             context.write(key, info);  
  12.         }  
  13.     }  

自定制的combiner用:

job.setCombinerClass(combiner.class);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值