2013-12-14 67 views
11

我在hadoop世界很新,努力實現一項簡單的任務。任何人都可以告訴我如何使用Map Reduce技術獲得字數統計示例的前n個值?不希望爲這個簡單的任務使用任何hadoop命令。 任何想法或建議將非常有幫助。 謝謝。Hadoop Map的前N個值減少代碼

+1

你是什麼意思「我不想使用任何hadoop命令來完成這個簡單的任務」? –

+1

在Hadoop中,reducer根據鍵的值對輸出進行排序。因此,在編寫輸出時,如果我們只是交換密鑰和值,我。即,將值(它將是計數)作爲鍵和鍵作爲值,然後它將根據值進行排序。然後我們所要做的就是運行命令: hadoop fs -cat | tail -n 其中n是您想知道的前n個值。但我不想用上面的命令來完成任務。我只是想通過map reduce progamming來完成。 – user3078014

+1

錯了。減速器不會對輸出進行排序。減速器從映射器中分類輸入!巨大差距! –

回答

18

你有兩個明顯的選擇:


有兩臺MapReduce作業:

  1. 字計數:計數所有的話(幾乎按示例)
  2. TOPN:MapReduce的作業找到頂部N的東西(這裏有一些例子:source code,blog post

讓WordCount的輸出寫入HDFS。然後,讓TopN讀取該輸出。這就是所謂的工作鏈,有很多方法來解決這個問題:oozie,bash腳本,從你的驅動程序發射兩個工作,等等。

你需要兩個工作的原因是你正在做兩個聚合:一個是字數,第二個是topN。通常在MapReduce中,每個聚合需要它自己的MapReduce作業。


首先,讓您的WordCount作業在數據上運行。然後,用一些bash把頂部的N拉出來。

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n20 

sort -n -k2 -r表示「按列#2按降序排列數字」。 head -n20排名前二十。

對於WordCount來說,這是更好的選擇,這是因爲WordCount可能只輸出數千或數萬行的順序,而您不需要MapReduce作業。記住,僅僅因爲你有hadoop並不意味着你應該用Hadoop解決你所有的問題。


一個非顯而易見的版本,這是棘手,但上述兩種的混合...

寫字計數MapReduce工作,但在減速這樣做的TOPN MapReduce作業我早些時候給你看。然後,讓每個減速器只輸出該減速器的TopN結果。

因此,如果您正在進行前10名,每個減速器將輸出10個結果。假設您有30個減速器,則會輸出300個結果。

然後,做同樣的事情在選項#2使用bash:

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n10 

這應該是更快,因爲你只是在後處理結果的一小部分。

這是我能想到的最快的方式,但這可能不值得。

+0

嗨唐納德,非常感謝您的解決方案。可以請告訴我,這種方法也正確,我在這裏寫入==>在Hadoop中,reducer根據鍵的值對輸出進行排序。因此,在編寫輸出時,如果我們只是交換密鑰和值,我。即,將值(它將是計數)作爲鍵和鍵作爲值,然後它將根據值進行排序。然後我們所要做的就是運行命令:hadoop fs -cat | tail -n其中n是我們想知道的前n個值。 – user3078014

+0

所以我們需要運行兩個map縮減工作來完成這個任務。第一個找到正常單詞的工作和相應的計數,第二個工作是找到每個reducer的頂部n的東西,我頂n。我不是很清楚第二份工作在代碼中。它是如何工作的,然後我們如何獲得所有減速器輸出中的前n個值?它是如何計算每次top n的,然後最終生成確切的top n值的? – user3078014

+0

你能解釋一下命令'sort -n -k2 -r | head -n20'..就像命令中的n,k2和r一樣? – user3078014

2

獲取MapReduce Design Patterns書以熟悉如何以MR方式解決問題。 Here是本書得到TopN的代碼。另外,請查詢Data-Intensive Text Processing with MapReduce瞭解更多算法。

+3

請勿使用此topTendriver代碼。 它使用TreeMap並覆蓋相同的int值記錄,並且它不計算總值以正確排序。 – halil

+0

@halil,也許你可以推薦更好的實現? –

+0

@halil對這種現象的任何解釋都會有幫助 –