1. 程式人生 > >Hadoop中maptask數量的決定因素

Hadoop中maptask數量的決定因素

post for PE wordcount 用戶 submitjob IT 子目錄 val

剛開始接觸hadoop平臺的時候 部分初學者對於mapreduce中的maptask的數量是怎麽確定的 可能有點迷惑,如果看了jobclient裏面的maptask初始化的那段源碼,那麽就比較清楚了,MapTask的數量是由InputFormat來指定的,InputFormat生成多少個InputSpilt就會有多少個task。

因此,如果剩余Map slot的數量大於InputSpilt的數量,那麽就啟動的Map數量就是InputSplit的數量。 如果剩余Map slot的數量小於InputSpilt的數量,那麽就啟動的Map數量就是剩余的Map slot數量。 下面來看看常用的InputFormat都是怎麽生成InputSplit的。 FileInputFormat(平時常用的TextInputFormat和KeyValueTextInputFormat都繼承自它)會設置一個hiddenFileFilter把以_和.開頭的文件過濾掉,遍歷input裏面的文件及其子目錄中的所有文件,然後對於每個文件,默認是一個block生成一個InputSplit。因此Map的數量>=文件數量,跟block size有關系,會盡量按block來切分。 當我們利用mapreduce來對hbase進行查詢的時候,會采用hbase自帶的TableInputFormat格式,TableInputFormat是默認使用的HBase的InputStream,繼承自TableInputFormatBase。一個InputSplit正好對應了一個Region,因此Map的數量取決於table有多少個region。

轉載來自:http://www.cnblogs www.ysgj1688.com www.feifanyule.cn/ com/xiangyangzhu/

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(www.thd178.com){return geInt("mapred.reduce.tasks",1)}
因此,Reduce Task數目是由mapred.reduce.tasks指定,如果不指定則默認為1.
這就很好解釋了wordcount程序中的reduce數量為1的問題,這時候map階段的partition(分區)就為1了。

Hadoop中maptask數量的決定因素