在getPartition方法當(dāng)中:
相同的key一定會(huì)得到相同的hashCode()洪囤,2147483647是Integer.MAX_VALUE撕氧,這是一個(gè)編程的技巧箍鼓,規(guī)范。把得到的數(shù)與最大值相與呵曹,得到的數(shù)肯定為一個(gè)正值款咖,這個(gè)時(shí)候再去對(duì)numReduceTasks取余,得到是哪個(gè)分區(qū)奄喂。取hashCode可以保證相同的key一定可以分到相同的分區(qū)里铐殃。
在運(yùn)行的主類中,模板代碼里跨新,設(shè)置這個(gè)numReduceTasks富腊,分區(qū)的個(gè)數(shù)。
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
//設(shè)置ReduceTask個(gè)數(shù)為1域帐,不寫的情況下默認(rèn)是1
job.setNumReduceTasks(2);
//設(shè)置Partition使用的是哪個(gè)類赘被,默認(rèn)的是HashPartitioner.class
job.setPartitionerClass(ProvincePartitioner.class);
//上邊這兩句要結(jié)合起來(lái)
如果默認(rèn)的分區(qū)規(guī)則不滿足我們的業(yè)務(wù)需求,重寫分區(qū)規(guī)則肖揣。MR提供了相關(guān)的接口供我們?nèi)ゾ帉懨窦佟懽约旱念悾瑢?shí)現(xiàn)Partitioner<K2, V2>龙优,重點(diǎn)是分區(qū)的編號(hào)羊异,即getPartition方法,返回的是int值彤断。重寫這個(gè)getPartition方法野舶。
numReduceTasks指定是多少,就會(huì)生成多少個(gè)文件宰衙。只是多余的文件里沒有內(nèi)容平道。
6、關(guān)于reduceTask個(gè)數(shù)跟分區(qū)數(shù)的關(guān)系
reduceTask = 分區(qū)數(shù) 完美運(yùn)行
reduceTask > 分區(qū)數(shù) 完美運(yùn)行 但是沒有數(shù)據(jù)來(lái)到的分區(qū) 結(jié)果文件為空 浪費(fèi)資源
reduceTask < 分區(qū)數(shù) 程序報(bào)錯(cuò) Illegal partition
hashCode是Object當(dāng)中的方法供炼,在字符串String類型中重寫了hashCode方法
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
為什么在String中重寫的hashCode方法選擇了乘以31一屋,因?yàn)?1計(jì)算起來(lái)方便窘疮,
而且31是一個(gè)質(zhì)數(shù)。