天天看點

【單點】每日突破,MapReduce分區

MapReduce分區

問:MapReduce在進行HashPartitoner時,會擷取key的hashCode,之後為什麼要與Integer.MAX_VALUE進行邏輯與計算?

答:

  • 源碼部分如下
public class HashPartitioner<K, V> extends Partitioner<K, V> {

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

}           

複制

  • (key.hashCode() & Integer.MAX_VALUE),因為Integer.MAX_VALUE最高位是符号位0,表示正數。如果hashCode得到的值為負數,符号位為1,會影響哈希取模的結果(Partition不能為負),此時進行邏輯與計算後,會變成一個正整數,進而保證取模結果正确。

問:如何實作自定義Partitioner?

答:

  • 建立自定義類,繼承Partitioner,重寫getPartition方法。
public class MyPartitioner extends Partitioner<Text, IntWritable> {

    @Override
    public int getPartition(Text key, IntWritable value, int numPartitions) {
        // TODO Auto-generated method stub
        return 0;
    }

}           

複制

  • 在Job中設定setPartitionerClass,并配置ReduceTask數量。
job.setNumReduceTasks(5);
job.setPartitionerClass(MyPartitioner.class);           

複制

今天的單點,你是否get到了呢?每日單點,用5分鐘收獲一點!今天你打卡了沒?

後話

如果有幫助的,記得點贊、關注。在公衆号《數舟》中,可以免費擷取專欄《資料倉庫》配套的視訊課程、大資料叢集自動安裝腳本,并擷取進群交流的途徑。

我所有的大資料技術内容也會優先釋出到公衆号中。如果對某些大資料技術有興趣,但沒有充足的時間,在群裡提出,我為大家安排分享。