2017-02-23 41 views
0

我有大約170 GB的數據。我必須使用hadoop 2.7.3來分析它。有14名工人。我必須找到每個文檔的唯一MIME類型的總數,例如文本/ html類型的文檔總數。當我運行mapreduce作業(用python編寫)時,Hadoop會返回許多輸出文件,而不是我期望的單個文件。我認爲這是由於許多工人單獨處理一些數據並給出結果。我想得到單一的輸出。哪裏有問題。我如何限制hadoop提供單一輸出(通過結合所有小型輸出文件)。如何結合hadoop mappers輸出獲得單一結果

+0

你可以設置setnumreducetasks(1)來獲得單個輸出,我相信 – Bhavesh

+0

你能更具體嗎?什麼是所需的輸出格式?你得到的輸出是什麼? – vefthym

回答

1

您的工作是爲每個映射器生成1個文件,您必須使用1個reducer強制執行reducer階段才能完成此操作,您可以在所有映射器中完成相同的密鑰。

2

您可以使用Hadoop getmerge命令合併結束文件,當您從HDFS檢索數據:

hadoop fs -getmerge /output/reduce/ /localcatalog/mergedresult.txt 

每個映射器和減速會生成一個單獨的文件,並通過減少映射器和減壓器你會數量降低您的工作並行度。我認爲,不要將reducer限制爲單個輸出,最好的方法是使用提供的命令從hdfs獲取合併結果。

+0

我認爲合併會導致重複,例如每個輸出文件中都會存在一個關鍵文本/ html。在最終的輸出中,它應該是所有的總和。 – Shafiq

+1

@Shafiq您不會有重複的情況,因爲Reducer會按鍵對您的數據進行分組,並在您的減速機作業中按順序分配這些數據。所以你會有不相交的範圍沒有任何重複。 getmerge會將它們合併成單個文件。 – Alex

+0

@ Shafiq亞歷克斯的答案是正確的當前問題陳述。你所評論的內容與原始問題不同。 「我必須找到每個文檔的唯一MIME類型的總數」不清楚 – vefthym

1

使你的映射器發出處理每個文件 - (doc-mime-type, 1)然後在減少階段計數所有這些對。從本質上講,這是一個標準的字數統計練習,除了您的mapper會爲每個doc的mime類型發射1個字符。

關於要設置的還原器數量:Alex合併還原器結果的方式是可取的,因爲它允許在還原階段使用所有工作器節點。但是,如果作業要在1-2個節點上運行,那麼只需一個減速器就可以正常工作。