2012-05-14 38 views
0

我們試圖獲取MapReduce程序在映射器中迭代的輸入路徑總數。我們將使用這個以及一個計數器來根據索引格式化我們的值。是否有一種簡單的方法可以從繪圖器中提取總輸入路徑數?提前致謝。在Hadoop Mapper中獲取總輸入路徑數

回答

0

您可以通過源代碼查看FileInputFormat.getSplits() - 這將拉回mapred.input.dir的配置屬性,然後將此CSV解析爲一組路徑。

這些路徑仍然可以代表文件夾和正則表達式,因此getSplits()所做的下一件事是將數組傳遞給受保護的方法org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(JobContext)。這實際上是通過dirs/regex列出的,並列出目錄/正則表達式匹配文件(如果已配置,也會調用PathFilter)。

因此,通過保護此方法,您可以創建一個FileInputFormat的簡單「虛擬」擴展,該擴展具有listStatus方法,接受Mapper.Context作爲參數,然後將調用包裝爲FileInputFormat.listStatus方法:

public class DummyFileInputFormat extends FileInputFormat { 
    public List<FileStatus> listStatus(Context mapContext) throws IOException { 
     return super.listStatus(mapContext); 
    } 

    @Override 
    public RecordReader createRecordReader(InputSplit split, 
      TaskAttemptContext context) throws IOException, 
      InterruptedException { 
     // dummy input format, so this will never be called 
     return null; 
    } 
} 

編輯:事實上,它看起來像FileInputFormat已經這樣做對你來說,在getSplits()方法(至少在1.0.2,大概在0.20推出的最後配置作業屬性mapreduce.input.num.files。 203)

Here's the JIRA ticket

+0

基督我得到了一個輸入路徑沒有發現異常,當我嘗試這一點。輸入路徑肯定存在。 –

+0

你可以發佈整個堆棧跟蹤(pastebin或soem這樣的地方,使格式更容易) –

+0

克里斯,我很抱歉,我們實現了一個自定義FileInputFormat,執行遞歸跟蹤。您的解決方案奏效再次感謝! –

0

您可以使用輸入路徑的數量在您的作業中設置配置。就像

jobConf.setInt("numberOfPaths",paths.length); 

只是把代碼放在你配置你的工作的地方。之後,通過從上下文中獲取它,將其從Mapper.setup(Mapper.Context context)中的配置中讀出。

相關問題