如果我的mapreduce作業讀取目錄中每個1 mb大小的60個文件,將執行多少Mapper。假設在這個/ user/cloudera/inputs /目錄下有60個文件,每個文件的大小是1 mbMapreduce程序的mappers的數量
在我的配置類mapreduce中,我指定了目錄/ user/cloudera/inputs /。
有人能告訴我有多少塊是用於存儲各1 MB大小的60個文件和多少映射器執行
它是60塊和60名映射器?如果是這樣有人給我解釋一下如何
如果我的mapreduce作業讀取目錄中每個1 mb大小的60個文件,將執行多少Mapper。假設在這個/ user/cloudera/inputs /目錄下有60個文件,每個文件的大小是1 mbMapreduce程序的mappers的數量
在我的配置類mapreduce中,我指定了目錄/ user/cloudera/inputs /。
有人能告訴我有多少塊是用於存儲各1 MB大小的60個文件和多少映射器執行
它是60塊和60名映射器?如果是這樣有人給我解釋一下如何
地圖任務通常每次處理一個輸入塊(使用默認的FileInputFormat)。如果文件非常小並且有很多這樣的文件,那麼每個地圖任務處理的輸入很少,而且有更多的地圖任務,每個任務都會增加額外的簿記開銷。將一個1GB的文件分成16個64MB的塊和10,000個100KB的文件。 10,000個文件每個都使用一個映射,並且作業時間可能比具有單個輸入文件的等效文件慢幾十到幾百倍。
In your case 60 map are used in 60 files and used 60 blocks.
如果你正在使用類似的TextInputFormat,問題是,每個文件都有至少1分,所以上界地圖的數量是文件的數量,而你的情況,你有很多非常小的文件最終都會由許多映射器處理每個非常少的數據。
爲了解決這個問題,你應該使用CombineFileInputFormat,它會將多個文件打包到同一個分區中(我認爲該分區大小限制),因此使用該格式,映射器的數量將獨立於文件數量,它將僅取決於數據量。
您將不得不通過擴展CombineFileInputFormt來創建自己的輸入格式,您可以找到一個實現here。一旦你定義了你的InputFormat,讓我們在鏈接CombinedInputFormat中調用它,你可以告訴你的工作使用它:
job.setInputFormatClass(CombinedInputFormat.class);