2012-09-13 62 views
2

我是hadoop世界的新人,我正在努力學習用地圖減少心態編寫代碼。爲什麼排序k1,1會改變輸出?

所以,我正在關注michael-noll教程。

我面臨的挑戰之一(除了理解新的框架外)是這個框架使用的終端技巧的數量。

所以 什麼。

$echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py | sort -k1,1 | /home/hduser/reducer.py 

表示???回聲是什麼?

而且,上面的代碼輸出爲:

bar  1 
    foo  3 
    labs 1 
    quux 2 

現在,如果我沒有那種-k1,1啄

foo  2 
    bar  1 
    labs 1 
    foo  1 
    quux 2 

什麼是那種標誌有什麼效果? -k1,1是什麼意思?

謝謝..

參考:http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

回答

6

在Linux中,垂直條,|用於重定向一個命令的輸出是另一個的輸入端。

echo命令將以下字符串寫入標準輸出。所以在你的情況下,它寫foo foo quux labs foo bar quux然後作爲輸入傳遞到/home/hduser/mapper.py,其輸出然後作爲輸入傳遞到sort,依此類推。

sort是對文本進行排序的Linux命令。 -k標誌告訴它要排序的列。所以1,1告訴它從第1列開始排序,結束於第1列。

在您的Linux終端中鍵入man sort以瞭解關於該命令的更多信息。我希望這有幫助!

+1

另外,在運行Hadoop Streaming作業時,您不需要在映射器和Reducer之間對數據進行排序,Hadoop MR框架將爲您處理排序。 – HypnoticSheep

+0

@HypnoticSheep:嗨什麼將會給我相同的輸出,如果我不把排序標誌,然後輸出是不同的「最小」命令集?我錯過了什麼?謝謝 – Fraz

+0

@Fraz由於我這裏沒有足夠的空間,我將在下面的答案中添加信息。 – HypnoticSheep

2

如果您打算使用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傳遞了中間值。

+0

感謝您的深入瞭解:) – Fraz

+0

高興地幫助:) – HypnoticSheep

相關問題