2014-07-12 99 views
0

我是hadoop的新手,並且正在運行一些示例以更熟悉它。我跑wordcount,當我去檢查輸出hadoop fs -cat outt我有3個目錄,而不是通常名爲outt/part-00000。下面是我的目錄:Hadoop WordCount輸出

-rw-r--r-- 1 hadoop supergroup   0 2014-07-11 20:13 outt/_SUCCESS 
-rw-r--r-- 1 hadoop supergroup   15 2014-07-11 20:13 outt/part-r-00000 
-rw-r--r-- 1 hadoop supergroup   0 2014-07-11 20:13 outt/part-r-00001 

當我做hadoop fs -cat outt/_SUCCESShadoop fs -cat outt/part-r-00001,似乎什麼都沒有。然而,當我做hadoop fs -cat outt/part-r-00000我得到:record_count 1.

我的文件只是說「Hello World」的,所以我期待的結果:你好1世界1

有誰知道如何得到正確的輸出?

+0

檢出 http://stackoverflow.com/questions/10666488/what-are-success-and-part-r-00000-files-in-hadoop – user3707934

回答

2

1.)_success和part-r-00000/1不是目錄,而是文件。目錄更像是一組文件和其他目錄

2)如果提交的作業由所有節點和縮減器成功執行並且結果集已完成,則由hadoop自動創建成功文件。

3.)如果您得到兩個零件文件,這意味着您的工作描述中有兩個減速器。檢查代碼以查找是否有像job.setNumReduceTasks(2);這樣的語句。零件名稱00000是第一個減速器的輸出,00001是第二個減速器的輸出。 'r'意味着輸出來自減速器。如果看到'm'而不是'r',這意味着你沒有減速器,而且這個作業只是地圖工作。

1

當你正在做hadoop fs -cat outt/part-r-00000並獲得輸出:record_count 1

這意味着可能是你指望在輸入文件的行數。

一旦你讀了一行,你需要標記行並把每個單詞(標記)從這個。

下面是示例代碼:

String line = value.toString(); 
StringTokenizer tokenizer = new StringTokenizer(line); 
while (tokenizer.hasMoreTokens()) { 
    word.set(tokenizer.nextToken()); 
    context.write(word, one); 
} 

您可以在這裏找到的完整代碼:WordCount

,而不是StringTokenizer這裏你可以在你的Java API的劃分方法。