1. 程式人生 > >MapReduce的分割槽

MapReduce的分割槽

一:分割槽Partitioner

在MapReduce中,通過指定分割槽,mapTask會將同一個分割槽的資料傳送到同一個reduce當中進行處理。也就是把相同型別的資料,傳送到同一個reductTask去處理。

注意:分割槽需要在yarn叢集上執行,不能本地測試。

二:程式碼實現

自定義分割槽類,注意分割槽實現階段在map階段,也就是分割槽時的key為k2,v2階段


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

/**
 * 自定義分割槽
 * 接收的引數是k2,v2
 * 多個分割槽,對應輸出的結果檔案也是多個
 */
public class Partition extends Partitioner<Text,NullWritable> {
    /**
     *
     * @param text:k2
     * @param nullWritable:v2
     * @param i
     * @return:返回分割槽數
     */
    @Override
    public int getPartition(Text text, NullWritable nullWritable, int i) {
        String s = text.toString();
        String[] split = s.split("\t");
        if(Integer.valueOf(split[5]) > 15){
            return 1;//到1號reduceTask
        }
        return 0;//到0號reduceTask
    }
}

三:設定分割槽類和reduceTask數量

//第三步:自定義分割槽

job.setPartitionerClass(Partition.class);

//設定分割槽數,也就是設定有幾個reduce,結果會產生幾個結果檔案,

//如果設定數量過大例如:2塊磚,設定了3個人ReduceTask處理,則其中有一個處理為空的內容,則返回的結果檔案有一個沒有值

//如果設定數量過小例如:2塊磚,設定了1個人ReduceTask處理,則會重複處理

job.setNumReduceTasks(2);

驅動程式: