如果您打算使用Hadoop Streaming,首先運行this tutorial並學習使用shell命令可能會有所幫助。它會幫助你很多。
基本上,由於Reducer的工作原理,你的輸出是不同的。它將所有值相加,而當前鍵與最後一個鍵相同。當前鍵與前一個鍵不同時,它將寫出前一個鍵的值並開始處理當前鍵。當你的輸入看起來像foo foo bar foo
,映射器以便處理這些值,從而產生像
foo 1
foo 1
bar 1
foo 1
在相同的格式這隨後被髮送給你的減速器的輸出。您的Reducer逐行讀取它。爲了讓大家更好地理解這一點,這裏有你需要減速的步驟:
// current_key = NULL
input_key,input_value: foo,1
input_key != current_key:
current_key = input_key
current_value = input_value
// current_value = 1
// current_key = foo
input_key,input_value: foo,1
input_key == current_key:
current_value += input_value
// current_value = 2
// current_key = foo
input_key,input_value: bar,1
input_key != current_key:
emit <current_key, current_value>
current_key = input_key
current_value = input_value
// current_value = 1
// current_key = bar
input_key,input_value: foo,1
input_key != current_key:
emit <current_key, current_value>
current_key = input_key
current_value = input_value
// current_value = 1
這會給你FOO 2的輸出,酒吧1,富1。現在,如果你排序輸入到減速機,它看起來像這樣:
foo 1
foo 1
foo 1
bar 1
這使得它,以便減速繼續增加的foo
的值加在一起而不被bar
鍵被打斷,所以你得到的輸出foo 3,bar 1.對值進行排序可以通過sort -k1,1
來完成,這是一個基於第一個字段排序的UNIX命令。 Hadoop MapReduce框架自動對中間值(即foo 1,foo 1,bar 1,foo 1數據)進行排序,以便具有相同密鑰的所有鍵值對在同一個Reducer中生成,產生相同的輸出您已通過sort -k1,1
傳遞了中間值。
另外,在運行Hadoop Streaming作業時,您不需要在映射器和Reducer之間對數據進行排序,Hadoop MR框架將爲您處理排序。 – HypnoticSheep
@HypnoticSheep:嗨什麼將會給我相同的輸出,如果我不把排序標誌,然後輸出是不同的「最小」命令集?我錯過了什麼?謝謝 – Fraz
@Fraz由於我這裏沒有足夠的空間,我將在下面的答案中添加信息。 – HypnoticSheep