码迷,mamicode.com
首页 > 其他好文 > 详细

Hadoop 高级程序设计(三)---自定义Partition和Combiner

时间:2014-09-25 16:55:17      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:hadoop   自定制partition   combiner   

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">拆开.代码:

public class NewPartition extends HashPartitioner<Text,Text>{
			String keyinfo;
			public int getPartition(Text key,Text value,int numReducerTasks){
				keyinfo = key.toString().split(":")[0];
				return super.getPartition(new Text(keyinfo), value, numReducerTasks);
			}
		}
自定制的partition使用:

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

public static class combiner extends Reducer<Text,Text,Text,Text>{
		private Text info = new Text();	//为了拆分 key值 准备存储新的value值
		public void reduce(Text key,Iterable<Text>values,Context context) throws IOException, InterruptedException{
			int sum = 0;
			for(Text val:values){
				sum += Integer.parseInt(val.toString());
			}
			int splitIndex = key.toString().indexOf(":");
			info.set(key.toString().substring(splitIndex+1)+":"+sum);	//新的value值
			key.set(key.toString().substring(0, splitIndex));
			context.write(key, info);
		}
	}

自定制的combiner用:

job.setCombinerClass(combiner.class);



Hadoop 高级程序设计(三)---自定义Partition和Combiner

标签:hadoop   自定制partition   combiner   

原文地址:http://blog.csdn.net/xd_122/article/details/39552011

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!