Partition主要做用就是將map的結果發送到相應的reduce。這就對partition有兩個要求:ide
1)均衡負載,儘可能的將工做均勻的分配給不一樣的reduce。spa
2)效率,分配速度必定要快。code
Mapreduce默認的partitioner是HashPartitioner。除了這個mapreduce還提供了3種partitioner。以下圖所示:blog
HashPartitioner計算方法是:繼承
which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,獲得當前的目的reducer。get
定義本身Partitionerhash
定義本身的分區也很簡單,只須要繼承Partitioner類就能夠,而且實現getPartition方法。it
這裏須要注意的是<ReadPosBean, SAMRecordWritable>這裏的key和value指的是map輸出的key和value數據類型io
public static class NewPartitioner extends Partitioner<ReadPosBean, SAMRecordWritable>{ @Override public int getPartition(ReadPosBean key, SAMRecordWritable value, int numPartitions) { int n = key.getPos()/reduceInterval; return n; } }
使用自定義的Partitioner更簡單table
//設置partition job.setPartitionerClass(NewPartitioner.class);
除了須要爲job指定其Partitioner以外,還須要設置reduce的個數,並且reduce的個數必須大於等於分區的個數,不然會出錯。
job.setNumReduceTasks(5);
我這裏分區爲5,reduce的個數也爲5.