須要多少個Map?html
Map的數目一般是由輸入數據的大小決定的,通常就是全部輸入文件的總塊(block)數。node
Map正常的並行規模大體是每一個節點(node)大約10到100個map,對於CPU 消耗較小的map任務能夠設到300個左右。因爲每一個任務初始化須要必定的時間,所以,比較合理的狀況是map執行的時間至少超過1分鐘。apache
這樣,若是你輸入10TB的數據,每一個塊(block)的大小是128MB,你將須要大約82,000個map來完成任務,除非使用 setNumMapTasks(int)(注意:這裏僅僅是對框架進行了一個提示(hint),實際決定因素見這裏)將這個數值設置得更高。api
Reducer的個數取決於用戶設置,用戶經過JobConf.setNumReduceTasks(int)來設置。app
總的來講,Reducer的實現須要經過重寫JobConfigurable.configure(JobConf)方法,這個方法須要傳遞一個JobConf參數,目的是完成Reducer的初始化工做。而後,框架爲成組的輸入數據中的每一個<key, (list of values)>對調用一次 reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。以後,應用程序能夠經過重寫Closeable.close()來執行相應的清理工做。框架
Reducer有3個主要階段:shuffle、sort和reduce。oop
Shufflehtm
reducer的輸入對應的是mapper的已排序的輸出。排序
Sorthadoop
框架在此階段根據輸入key的值對reducer的輸入進行分組(由於不一樣mapper的輸出中可能會有相同的key);
Shuffle和sort兩個階段是同時進行的;map的輸出也是邊取回邊合併的。
Secondary Sort
若是須要中間過程對key的分組規則和reduce前對key的分組規則不一樣,那麼能夠經過 JobConf.setOutputValueGroupingComparator(Class)來指定一個Comparator。再加上 JobConf.setOutputKeyComparatorClass(Class)可用於控制中間過程的key如何被分組,因此結合二者能夠實現按值的二次排序。
Reduce
本階段框架爲已分組的輸入數據中的每一個 <key, (list of values)>對調用一次 reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。
reduce任務的輸出一般是經過調用OutputCollector.collect(WritableComparable, Writable)來寫入文件系統的。
應用能夠利用Reporter來報告進度,設置程序級別狀態消息和更新計數器,或是僅僅告知程序運行正常。
Reducer的輸出沒有排序處理。
須要多少Reduce
Reduce的數目建議是0.95或1.75乘以 (<no. of nodes> *mapred.tasktracker.reduce.tasks.maximum)。