可以帶著下面問題來閱讀:
mapreduce的過程都包含什麼操作?
map處理完後,tasktracer會完成什麼任務?
ruducer的作用是什麼?
map中經過誰的處理之後,變為reduce輸入?
1. 首先, 我們能確定我們有乙份輸入, 而且他的資料量會很大
2. 通過split之後, 他變成了若干的分片, 每個分片交給乙個map處理
3. map處理完後, tasktracker會把資料進行複製和排序, 然後通過輸出的key 和value進行 partition的劃分, 並把partition相同的map輸出, 合併為相同的reduce的輸入.
4. ruducer通過處理, 把資料輸出, 每個相同的key, 一定在乙個reduce中處理完, 每乙個reduce至少對應乙份輸出(可以通過擴充套件multipleoutputformat來得到多分輸出)
5. 來看乙個例子, 如下圖:(來自 《hadoop權威指南》 一書)
說明幾點:
5.1 輸入的資料可能就是一堆文字
5.3 map的輸出就是一條一條的 key-value
5.4 通過shuffle之後, 變成reduce的輸入, 這是相同的key對應的value被組合成了乙個迭代器
5.5 reduce的任務是提取每一年的最高氣溫, 然後輸出
3. 實現map方法, 方法有四個引數, 前面兩個就是輸入的 key 和 value, 第三個引數是 ouputcollector, 用於收集輸出的, 第四個是reporter,用來報告一些狀態的,可以用於debug
3.1 input 預設是一行一條記錄, 每天記錄都放在value裡邊
3.2 output 每次蒐集一條 k-v記錄, 乙個k可以對應多個value, 在reduce 裡面體現為乙個 iterator
4. 覆蓋 configure方法可以得到jobconf的例項, 這個jobconf是在job執行時傳遞過來的, 可以跟外部資源進行資料互動
三. reducer
3. 實現reduce方法, 這個方法也有四個引數, 第乙個是輸入的key, 第二個是輸入的 value的迭代器, 可以遍歷所有的value,相當於乙個列表,
outputcollector跟map的一樣, 是輸出的蒐集器, 每次蒐集都是key-value的形式, report的作用跟map的相同.
4. 在新版本中, hadoop已經將後面兩個引數合併到乙個context物件裡邊了, 當然還會相容就版本的 介面. >0.19.x
5. 覆蓋configure方法, 作用跟map的相同
6. 覆蓋close 方法,可以做一些reduce結束後的處理工作.(clean up)
四. combiner
1. combiner的作用是, 將map的輸出,先計算一遍,得到初步的合併結果, 減少reduce的計算壓力.
2. combiner的編寫方法跟reduce是一樣的, 他本來就是乙個reducer的實現類
3. 當reducer符合函式 f(a,b) = f(f(a), f(b)) 時, combinner可以與reduce相同. 比如 sum(a,b,c,d,e,f,g) = sum(sum(a,b) ,sum(c,d,e,f) , sum(g)) 還有max, min等等.
4. 編寫正確的combiner可以優化整個mapreduce程式的效能.(特別是當reduce是效能瓶頸的時候.)
5. combiner可以跟reducer不同.
五. configuration
1. 後加的屬性的值會覆蓋前面定義的相同名稱的屬性的值.
2. 被定義為 final的屬性(在屬性定義中加上true標籤)不會被後面的同名屬性定義的值給覆蓋.
3. 系統屬性比通過資源定義的屬性優先順序高, 也就是通過system.setproperty()方法會覆蓋在資源檔案中定義的屬性的值.
4. 系統屬性定義必須在資源檔案中有相應的定義才會生效.
5. 通過 -d 選項定義的屬性, 比在資源檔案中定義的屬性優先順序要高.
六. run jobs
1. 設定 inputs & output
1.1 先判斷輸入是否存在 (不存在會導致出錯,最好利用程式來判斷.)
1.2 判斷輸出是否已經存在(存在也會導致出錯)
1.3 養成一種好的習慣(先判斷,再執行)
3. 設定 inputformat & outputformat & types
3.1 input和output format都有兩種, 一種是 textfile, 一種是sequencefile. 簡單理解, textfile是文字組織的形式,sequence file是 二進位制組織的形式.
3.2 types的設定, 根據輸入和輸出的資料型別, 設定各種writable介面的實現類的class物件.
4. 設定reduce count
4.1 reduce count可以為0, 當你的資料無需reduce的時候.
4.2 reduce數量最好稍微少於當前可用的slots的數量, 這樣reduce就能在一波計算中算好. (乙個slot可以理解為乙個計算單元(資源).)
七. 其他的一些細節.
3. 多個job先後執行, 可以通過先後執行 jobclient.runjob方法來實現先後順序
4. 擴充套件multipleoutputformat介面, 可以實現乙個reduce對應多份輸出 (而且可以指定檔名哦)
5. partitioner 介面用於將 map的輸出結果進行分割槽, 分割槽相同的key對應的資料會被同乙個reducer處理
5.1 提供了乙個介面方法: public int getpartition(k2 key, v2 value, int numreducetasks)
5.2 可以自己定義, 根據key的某些特指來劃分, 也可以根據value的某些特質來劃分.
5.3 numreducetasks就是設定的reduce的個數.一般返回的partition的值應該都小於這個值.(%)
6. reporter的作用
6.1 reporter.incrcounter(key, amount). 比如對資料計算是, 一些不合規範的髒資料, 我們可以通過counter來記錄有多少
6.2 reporter.setstatus(status); 方法可以設定一條狀態訊息, 當我們發現job執行出現這條訊息是, 說明出現了我們預期的(錯誤或者正確)的情況, 用於debug.
6.3 reporter.progress(), 像mapreduce框架報告當前執行進度. 這個progress可以起到心跳的作用. 乙個task要是超過10分鐘沒有想mapreduce框架報告情況, 這個reduce會被kill掉. 當你的任務處理會比較舊是, 最好定時向mapreduce匯報你的狀態.
7. 通過實現wriable介面, 我們可以自定義key和value的型別, 使用起來就像pojo, 不需要每次都進行parse. 如果你的自定義型別是key的型別, 則需要同時實現comparable 介面, 用於排序. 比如mapwritable就是乙個例子.
MapReduce 程式設計模型概述
mapreduce 程式設計模型給出了其分布式程式設計方法,共分 5 個步驟 1 迭代 iteration 遍歷輸入資料,並將之解析成 key value 對。2 將輸入 key value 對對映 map 成另外一些 key value 對。3 依據 key 對中間資料進行分組 grouping ...
MapReduce 程式設計模型概述
mapreduce 程式設計模型給出了其分布式程式設計方法,共分 5 個步驟 1 迭代 iteration 遍歷輸入資料,並將之解析成 key value 對。2 將輸入 key value 對對映 map 成另外一些 key value 對。3 依據 key 對中間資料進行分組 grouping ...
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...