从零开始大数据【1.3】-- mapreduce中的分区(设置多个reducer)

从零开始大数据【1.3】-- mapreduce中的分区

上期回顾:

上一期自定义了mapreduce中kv对可以用的数据类型。并且使用了一个谷歌应用商场数据作为数据集。接下来的案例都会使用这个数据集,在这一节中将学会如何自定义mapreduce过程中的分区。

主要内容

所谓分区,即reducer的数量,一般来说一个reducer将结果输入到一个文件,当需要特定的比如按月输出数据时,就需要多个reducer输出多个文件。默认的partition过程如下:是一个对键取哈希值然后mod设定的reducer数量的值,判断将kv放入哪一个reducer中运行。

public class HashPartitioner<K, V> extends Partitioner<K, V> {
 	public int getPartition(K key, V value, int numReduceTasks) {
 		return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
	 }
}

真实案例

仍然使用上一节的数据集,这一次将game类别的单独输出在一个文件中,其余的在一个文件中。

代码编写

首先定义catpartitioner类

package appmapreduce;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

public class catpartitioner extends Partitioner<Text, nbean>{
	@Override
	public int getPartition(Text key, nbean value, int numpartitions) {
		
		//1 
		if ("GAME".equals(key.toString())) {
			return 1;
		}
		// TODO Auto-generated method stub
		else {
			return 0;
		}
		
	}

}

之后再在driver类中添加关联partitioner为自定义的类,并设置reduecer的个数。

从零开始大数据【1.3】-- mapreduce中的分区(设置多个reducer)

运行结果

如图所示为生成文件的文件路径,可以发现和原来的比多了一个part。
从零开始大数据【1.3】-- mapreduce中的分区(设置多个reducer)
打开后可以看到,有一个是GAME,另一个是不含GAME的。
从零开始大数据【1.3】-- mapreduce中的分区(设置多个reducer)

总结

总结一下 编写分区程序就是定义一个分区类继承partitioner,并且重写里面的getpartition方法。
之后在driver类中关联partitioner为自定义的类,并设置reduecer的个数。其中如果reducer的个数和分区的一致,则输出正常,如果reducer的个数设置成1则输出一个文件,如果不唯一又不能和partitioner的一致则会报错。