注意標題:Map Task數目的確定和Reduce Task數目的指定————自然得到結論,前者是后者決定的,后者是人為指定的。查看源碼可以很容易看懂
1、MapReduce作業中Map Task數目的確定:
1)MapReduce從HDFS中分割讀取Split文件,通過Inputformat交給Mapper來處理。Split是MapReduce中最小的計算單元,一個Split文件對應一個Map Task
2)默認情況下HDFS種的一個block,對應一個Split。
3)當執行Wordcount時:
(1)一個輸入文件小雨64MB,默認情況下則保存在hdfs上的一個block中,對應一個Split文件,所以將產生一個Map Task。
(2)如果輸入一個文件為150MB,默認情況下保存在HDFS上的三個block中,對應三個Split文件,所以將產生三個Map Task。
(3)如果有輸入三個文件都小於64MB,默認情況下會保存在三個不同的block中,也將產生三個Map Task。
4)用戶可自行指定block與split的關系,HDSF中的一個block,一個Split也可以對應多個block。Split與block的關系都是一對多的關系。
5)總結MapReduce作業中的Map Task數目是由:
(1)輸入文件的個數與大小
(2)hadoop設置split與block的關系來決定。
2、MapReduce作業中Reduce Task數目的指定:
1)JobClient類中submitJobInternal方法中指定:int reduces=jobCopy.getNumReduceTasks();
2)而JobConf類中,public int getNumReduceTasks(){return geInt("mapred.reduce.tasks",1)}
因此,Reduce Task數目是由mapred.reduce.tasks指定,如果不指定則默認為1.
這就很好解釋了wordcount程序中的reduce數量為1的問題,這時候map階段的partition(分區)就為1了。
