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分鐘收獲一點!今天你打卡了沒?
後話
如果有幫助的,記得點贊、關注。在公衆号《數舟》中,可以免費擷取專欄《資料倉庫》配套的視訊課程、大資料叢集自動安裝腳本,并擷取進群交流的途徑。
我所有的大資料技術内容也會優先釋出到公衆号中。如果對某些大資料技術有興趣,但沒有充足的時間,在群裡提出,我為大家安排分享。