2014-03-19 70 views
1

我正在做一個具有單個200MB文件的MapReduce。我的目標是完成1個地圖任務。我做了:將Hadoop配置爲將輸入文件處理爲一個地圖任務

Configuration conf = new Configuration(); 
conf.set("mapred.min.split.size","999999999999999"); 

但是,仍然看起來,記錄的數量限制了我。這是分裂地圖任務的原因嗎?如果是這樣,我可以做些什麼來改變它?

14/03/20 00:12:04 INFO mapred.MapTask: data buffer = 79691776/99614720 
14/03/20 00:12:04 INFO mapred.MapTask: record buffer = 262144/327680 
14/03/20 00:12:05 INFO mapred.MapTask: Spilling map output: record full = true 

回答

0

mapred.min.split.size通常形成用於創建輸入分裂的下限,而DFS塊大小是128MB。所以在你的情況下,下限超過了上限,看起來hadoop並不關心這個問題,並且與上限一致,並相應地分割輸入數據。

從維基報價:

實際上控制地圖的數量是微妙的。 mapred.map.tasks參數僅僅是 地圖數量的InputFormat提示。默認的InputFormat行爲是將總數爲 的字節拆分爲正確數量的片段。但是,在 默認情況下,輸入文件的DFS塊大小將被視爲輸入拆分的上限 。分割大小的下限可以是 ,通過mapred.min.split.size設置。因此,如果您希望10TB的輸入數據爲 ,並且具有128MB的DFS塊,則最終將獲得82k個地圖,除非您的mapred.map.tasks更大。最終,InputFormat決定了 地圖的數量。

對你的暗示是在最後一句,如果你想控制映射器的NUMER,你必須重寫InputFormat,通常我們使用FileInputFormat和它的isSplittable()方法需要被重寫返回false。這將確保每個文件都有一個映射器。 類似如下siffice:

Class NonSplittableFileInputFormat extends FileInputFormat{ 

    @Override 
    public boolean isSplitable(FileSystem fs, Path filename){ 
     return false; 
    } 
} 
+0

我已經試過,以前,不工作。 TextInputFormat將我的文件分割成每行一條記錄。看起來,當它有> 262144條記錄時,它會自動泄漏給一個新的映射器。 – springcold

+0

哦!真奇怪。那麼你是否說,即使isSplittable()返回false,該文件被拆分?我認爲hadoop根本不在乎文件中的記錄數量,它根據文件大小和DFS塊大小進行分割。 – Amar

+0

哈哈..我也是這樣讀的,雖然我不太熟悉溢出的概念 – springcold

相關問題