1. 程式人生 > >019_Map Task數目的確定和Reduce Task數目的指定

019_Map Task數目的確定和Reduce Task數目的指定

注意標題: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了。