2012-01-12 52 views
2

我是Hadoop和MapReduce的新手。我有這個範圍內某些目錄和文件(每個文件10 MB大和N可能是100文件可以壓縮或解壓縮),如: MyDir1 /文件1 MyDir1 /文件2 ... MyDir1/fileN一個映射器或一個reducer來處理一個文件或目錄

MyDir2 /文件1 MyDir2 /文件2 ... MyDir3/fileN

我想設計一個MapReduce的應用程序,其中一個映射或減速將處理整個MyDir1即我不想讓MyDir1在多個映射器進行分割。同樣,我希望MyDir2可以完全由其他映射器/縮減器進行處理而不會分裂。

關於如何去做這件事的任何想法?我是否需要編寫自己的InputFormat並讀取輸入文件?

+0

我其實有兩個相同的要求。我需要不要拆分文件,因爲文件頂部有標題信息。我需要一個每個映射器的目錄,以便我可以處理該目錄中的文件,以便排序文件(按日期/時間)比排序單個行要高效得多。 – MikeKulls 2014-08-29 04:55:55

回答

5

執行FileInputFormat#isSplitable()。然後,輸入文件不會被拆分,並且每個地圖都會被處理一個。請注意,儘管映射器並行執行,完成作業的時間取決於處理最大輸入文件的時間。而且,這可能效率不高,因爲跨節點會有大量數據混洗。

import org.apache.hadoop.fs.*; 
import org.apache.hadoop.mapred.TextInputFormat; 
public class NonSplittableTextInputFormat extends TextInputFormat { 
    @Override 
    protected boolean isSplitable(FileSystem fs, Path file) { 
     return false; 
    } 
} 

當前的API不允許整個目錄被一個映射器處理。您可能需要編寫自己的InputFormat。否則,創建一個待處理的目錄列表,並將每個目錄傳遞給每個映射器以進行處理,同樣由於節點之間的數據混排,效率不高。

回到還原器,它們對映射器的輸出KV對進行操作,而不是輸入文件/目錄。

+0

如果這個類是在另一個類中定義的,看起來像是MR的標準,那麼它將需要被標記爲靜態。 – MikeKulls 2014-09-02 00:22:32

+0

@Praveen:你能告訴我爲什麼在這種情況下會有大量的數據混洗? – 2015-11-17 04:20:14

+0

@vishnu:因爲在這種特定的方法中,不能保證地圖正在運行的節點中存在數據。所以,地圖處理最有可能從另一個節點獲取數據 – Bala 2016-06-29 10:30:07

相關問題