AndyTsai 寫:
假設我再伪分散式系統下跑MapReduce,如果我map輸出有6個key
setNumReduceTasks設為3
所以Reducer在執行時是會出現
3個reduce平行處理
key1=>key4
key2=>key5
key3=>key6
這樣嗎??
對。
AndyTsai 寫:
假設我再全分散式系統下跑MapReduce,如果我有三台電腦做,map輸出有9個key
setNumReduceTasks設為2
是指每台電腦會分到3個key,每台電腦會有兩個reduce平行處理
所以Reducer在執行時是會出現
key1=>key3
key2
請問我這樣有錯嗎,煩請大大門指教
不能把 Reducer 跟電腦劃上等號,因為每台電腦預設可以跑兩個 reducer。
當有三台電腦,合計 6 個 reduce slot (想成三台電腦,每台有兩個插槽,每次有人要用 reduce 會去搶那幾個插槽)
當 setNumReduceTasks 設為 2,意思就是您的程式希望搶到兩個插槽。
至於這兩個插槽是在同一台的兩個插槽,還是兩台機器上各拿到一個插槽,端看機率。
當 mapper 產生 9 個 output key , setNumReduceTask 設為 2
則 Reduce 狀況將是
Reducer Task #1 on Machine A : key 1 -> Key 3 -> Key 5 -> Key 7 -> Key 9
Reducer Task #2 on Machine B : key 2 -> Key 4 -> Key 6 -> Key 8
AndyTsai 寫:
如何指定用幾台電腦做與一台電腦有幾個reduce再跑呢??
設定 mapred-site.xml 中的 mapred.tasktracker.reduce.tasks.maximum 參數
AndyTsai 寫:
再請問一個比較大的問題,
假設今天我map出來的key1資料非常龐大,龐大到一台電腦的reducer根本裝不下
如果有3個map,我可以讓reducer先接收map1得key1資料,處理完把不要的東西洩掉
再處理map2得key1資料,處理完把不要的東西洩掉
再處理map3得key1資料,處理完把不要的東西洩掉...這樣嗎,
如果今天一個key的資料非常龐大,Reducer裝不下,是否能有解覺得辦法呢??
非常感謝大大門回答!
這個現象稱為「鍵空間傾斜(skewed keyspace)」,書中有介紹。
此時第一個可能的解法是加入 Combiner,來降低 Mapper 的輸出量。
其次就是讓 mapper 的輸出資料進行「壓縮」(Hadoop MapReduce 支援 Gzip, Gzip2, 也有 LZO 的 patch)
代碼:
Mapper #1 --> Combiner #1 ------+
|
Mapper #2 --> Combiner #2 ------+----> Reducer #1
|
Mapper #3 --> Combiner #3 ------+
- Jazz