2014-11-01 27 views
0

在我的Hadoop項目中,我正在讀取每行有多個名稱的文本文件行。第一個名字代表我的用戶名,其餘的是朋友列表。 然後我在map函數中創建一對(用戶名,朋友),每一對都有一個鍵「Key [name1] [name2]」,其中name1,2是用戶名和朋友名字按字母順序排列。 正常情況下,在讀取userA和userB這一行的行,並且他們在他們的朋友列表中都有對方,我會得到2個具有不同值的標識鍵,在這種情況下是:KeyUserAUserB:「UserA,UserB」和KeyUserAUserB :「UserB,UserA」。 我期望的reduce函數是在某一時刻將KeyUserAUserB作爲一個鍵和一對「UserA,UserB」,「UserB,UserA」作爲值。所以值迭代器將有2個元素。 但是,在reducer函數中,我分別獲得了兩次KeyUserAUserB。這不是我期待的Hadoop ...Hadoop奇怪的行爲:減少功能並沒有得到一個鍵的所有值

我也注意到在我的用戶日誌中,我有4個「m」文件夾,並且在其中的前2箇中,我有幫助我識別上述內容的日誌。在這兩個「m」日誌中,map函數的輸出(System.out)都與reduce函數的輸出交織在一起。我不知道這與我的異常情況有什麼關係,但我希望減少輸出保留在「r」文件夾中。 此外,對於上述示例,KeyUserAUserB的一個日誌打印在一個「m」日誌文件中,另一個KeyUserAUserB打印在另一個日誌文件中。雖然在某些情況下,KeyUserAUserB會使用兩個值進入reducer,發現至少有一個情況是它從來沒有出現過這兩個值(還有那些2對鍵值相同的密鑰駐留在不同的「m」日誌文件中)。

另一件事我注意到,輸出從Reduce函數不會直接將值輸出文件收集,但再次通過它們作爲同Reduce函數的輸入...

做什麼你想想這個行爲,可能的原因是什麼?

回答

0

最後。整個意想不到的行爲是因爲我正在使用組合器類= reducer類。在評論該行後,一切都按預期工作。