在hadoop中,每個mapreduce任務都被初始化為乙個job,每個job又可分為兩個階段:map階段和reduce階段。這兩個階段分別用兩個函式來表示。map函式接收乙個形式的輸入,然後同樣產生乙個形式的中間輸出,hadoop會負責將所有具有相同中間key值的value集合在一起傳遞給reduce函式,reduce函式接收乙個如形式的輸入,然後對這個value集合進行處理,每個reduce產生0或1個輸出,reduce的輸出也是形式。
簡易**:
//設定常量1,用來形成形式的輸出
private fianll static intwritable one = new intwritable(1)
private text word = new text();
public void map(longwritable key,text value,outputcollectorword.set(tokenizer.nexttoken());
output.collect(word,one);}}
}//需要注意的是,reduce將相同key值(這裡是word)的value值收集起來,形成的形式,再將這些1累加
public static class reduce extends mapreducebase implements reducer
output.collect(key,new intwritbale(sum));}}
執行概念總結:
job.setinputformatclass(textinputformat.class);1.inputformat()和inputsplitinputsplit是hadoop定義的用來傳送給每個單獨的map的資料,inputsplit儲存的並非資料本身,而是乙個分片長度和乙個記錄資料位置的陣列,生成inputsplit的方法可以通過inputformat(i)來設定。當資料傳送給map時,map會將輸入分片傳送到inputformat上,inputformat則呼叫getrecordreduer()方法生成recordreader,recordreader再通過createkey()、createvalue()方法建立可供map處理的對,即,簡而言之inputformat方法是用來生成可供map處理的對的。
在這裡如果不設定的話,textinputformat會是hadoop預設的輸入方法,在textinputformat中,每個人間(或其一部分)都會單獨地作為map的輸入,繼承自fileinputformat,之後,每行資料都會生成一條記錄,每條記錄則表示成形式:
其中,key值是每個資料的記錄在資料分片中的位元組偏移量,資料型別是longwritable.
value值是每行的內容,資料型別是text。
job.setoutputvalueclass(textinputformat.class);2、outputformat每一種輸入格式都有一種輸出格式與其對應。同樣,預設的輸出格式是textoutputformat,這種輸出方式與輸入類似,會將每條記錄以一行的形式存入文字檔案。不過它的鍵和值都可以以任意形式的,因為程式內部會呼叫tostring()方法將鍵和值轉換為string型別再輸出。
3、map和reduce
reduce函式以map的輸出作為輸入,因此reduce的輸入型別是.而reduce的輸出是單詞和它的數目,因此,它的輸出型別是
4、任務排程
計算方面:hadoop總會有限將任務分配給空閒的機器,使所有的任務能公平地分享系統資源,i/o方面:hadoop會盡量將map任務分配給inputsplit所在機器,以減少網路i/o的消耗。
5、資料預處理與inputsplit的大小。
hadoop會在處理每個block後將其作為乙個inputsplit,因此合理地甚至block塊大小是很重要的。也可通過合理地設定map任務的數量來調節map任務的資料輸入。
6、map和reduce任務的數量
設定map任務槽和reduce任務槽,map/reduce任務槽是這個集群能夠同時執行的map/reduce任務的最大數量。可以通過hadoop的配置檔案設定每台機器最多可以同時執行map任務和reduce任務的個數,比如有10臺機器,設定每台最多可以同時執行10個map任務和5個reduce任務,那麼這個集群的map任務槽就是1000,reduce任務槽就是500.一般來說,設定的reduce任務數量應該是reduce任務槽的0.95或是1.75倍
7、combine函式
combine函式是用於在本地合併資料的函式,從wordcount程式中,詞頻是乙個接近於zipf分布的,每個map任務可能會產生成千上萬個記錄,若將這些記錄一一傳給reduce任務是很耗時的,所以可以設定乙個combine函式,用於本地合併,大大減少網路i/o操作的消耗。
job.setcombinerclass(combine.class);8、hadoop流的工作原理//指定reduce函式為combine函式
job.setreducerclass(reduce.class);
參考:
MapReduce提交job到Yarn的流程學習
6 在客戶端執行乙個mapreduce程式時,能看到map和reduce任務執行的進度百分比,這個是am在執行initialize job後建立的薄記物件完成的,這個薄記物件會收集執行在分布式各個節點上任務的進度,彙總後定時傳送給client。7 在執行mapreduce程式時,會先執行map任務然...
MapReduce程式設計模型
計算採用一組輸入鍵 值對,並產生一組輸出鍵 值對。mapreduce庫的使用者將計算表達為兩個函式 map和reduce。input1 map a,1 b,1 c,1 input2 map b,1 input3 map a,1 c,1 reduce c,2 reduce b,2 reduce a,2...
MapReduce 程式設計模型
mapreduce 簡介 mapreduce 本身是一種支援並行運算的程式設計模型 思想 這個程式設計模型分為兩個階段 map 階段和 reduce 階段。hadoop 的 mapreduce 框架 hadoop 的 mapreduce 是實現 mapreduce 程式設計模型的乙個分布式計算框架,...