hadoop编程技巧(3)---定义自己的区划类别Partitioner

时间:2021-12-31 03:43:31

Hadoop代码测试环境:Hadoop2.4

原则:在Hadoop的MapReduce过程。Mapper阅读过程完成后数据。它将数据发送到Partitioner。由Partitioner每个记录应当采取以确定哪些reducer节点,它用于通过缺省HashPartitioner。其核心代码例如以下:

/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K2 key, V2 value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}

getPartition的输出參数就是Mapper输出的key和value,然后针对这种输入。採用key的hash值来推断当前记录应该被分为哪个reducer中(假设numReduceTasks为1,那么事实上就仅仅有一个分组,这里使用的是取模运算)。

应用场景:假如,我们事前已经对我们的数据以及Mapper处理后的输出数据都有一个非常好的了解,那么事实上我们能够控制记录应该送往哪个reducer进行处理,这样方便我们採取某种策略,来使reducer处理的数据量基本同样。达到一种均衡的效果。这样。对我们数据处理的效率也会有非常大的提高。当然,这种策略须要我们对数据的了解会比較高。

实例:

首先自己定义Partitioner(假设,我们须要把值value以A开头的数据分入一个reducer。那么能够使用以下的Partitioner)。能够參考HashPartitioner,:

package fz.partitioner;

import org.apache.hadoop.mapreduce.Partitioner;

public class MyPartitioner<K1, V1> extends Partitioner<K1, V1> {

	@Override
public int getPartition(K1 key, V1 value, int numPartitions) {
String tmpValue = value.toString();
// 假设value值以A开头。那么就把数据发送到当中一个reducer,否则发送到另外的一个;
if(tmpValue!=null&&tmpValue.indexOf("A")==0){
return 0;
}
return 1;
} }

接着定义一个什么都不做的MR任务,仅仅是简单的读取数据,调用自己定义的MyPartitioner。然后查看输出结果。是否是我们须要的。

定义driver:

package fz.partitioner;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class PartitionerDriver extends Configured implements Tool { @Override
public int run(String[] arg0) throws Exception {
Configuration conf = getConf();
if(arg0.length!=2){
System.err.println("Usage:\nfz.partitioner.PartitionerDriver <in> <out>");
return -1;
}
// System.out.println(conf.get("fs.defaultFS"));
Path in = new Path(arg0[0]);
Path out= new Path(arg0[1]);
out.getFileSystem(conf).delete(out, true);
Job job = Job.getInstance(conf,"test partitioner");
job.setJarByClass(getClass()); job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class); job.setPartitionerClass(MyPartitioner.class);
job.setMapperClass(Mapper.class);
job.setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(Text.class);
job.setReducerClass(Reducer.class);
job.setNumReduceTasks(2);
FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out); return job.waitForCompletion(true)?0:-1;
} public static void main(String[] args) throws Exception {
ToolRunner.run(new Configuration(), new PartitionerDriver(),args);
}
}

这里设置了自己定义的MyPartitioner,同一时候设置reducer的个数为2。

执行MR程序,查看结果:

aaarticlea/png;base64,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" alt="" />aaarticlea/png;base64,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" alt="" />

通过上面的结果对照,能够发现,(在mapper中并没有不论什么的逻辑操作)。输出的数据仅仅是设置了Partitioner,然后就能够达到不同数据输出到不同的reducer的效果。

总结:假设对数据的总体有非常好的了解。能够使用自己定义Partitioner来达到reducer的负载均衡,提高工作效率。

分享,成长,高兴

转载请注明blog地址:http://blog.csdn.net/fansy1990