MapReduce之Partition的使用與分析

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.

相關文章
相關標籤/搜索