2014-01-17 31 views
0

我遇到以下問題。我有200k xml文件。我有200個文件夾,每個文件夾有2000個xml文件。我在HDFS中有這個。體系結構低於如何處理HADOOP中的多個文件夾

RootFolder 
    Folder001 
     1.xml 
     2.xml 
     2000.xml 
    Folder002 
     2001.xml 

我需要編寫一個映射程序來讀取文件並執行一些Xpath過程。

如果我給了RootFolder輸入路徑則映射器應閱讀的文件夾和處理XML文件

也就是說應該有200任務。並且每個文件夾應該由單個映射器讀取

如何處理多個文件夾?

+0

每個文件夾應該由單個映射器讀取?你爲什麼需要它?看起來不安,你描述的工作想要更具體地完成,也許你問B但實際上想要A – michaeltang

+0

好吧。我需要在每個文件夾的單個文件中提取和寫入Xpath值。所以完全應該有200個輸出文件 – Backtrack

+0

不。如果我爲每個xml創建一個映射器,那麼將會有大約2個映射器,這會降低性能 – Backtrack

回答

1

從我的理解,你有2個問題:

1:需要通過一個單一的地圖任務中的子文件夾中的所有文件映射:

答:你可以利用CombineFileInputFormat對於這種情況。它會將文件分組爲指定的PathFilter(在你的情況下,過濾器應該接受同一個文件夾的文件),並將它分配給一個單獨的maptask。即可以實現每個文件夾的maptask。爲了獲得更好的控制,請擴展CombineFileInputFormat並使其成爲您自己的,那我在我的情況下做什麼。

2:通過只指定根文件夾,需要在子文件夾內包含文件,作爲地圖任務的輸入。

答案:在新的API版本中,FileInputFormat可以遞歸地從其子文件夾中將文件提取到任何級別。 欲瞭解更多信息,你可以看到jira here

或者如果您想自己做,可以使用子類FileInputFormat並覆蓋listStatus方法。

+0

它給了我一些想法。我沒有任何子目錄。你能給我一些代碼示例 – Backtrack

+0

你不介意看看CombineInputFromat的源代碼[鏈接](https://github.com/apache/hadoop-common/blob/trunk/hadoop-mapreduce-project/hadoop-mapreduce-client/ hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/input/CombineFileInputFormat.java)?它會讓你知道如何將每個文件夾中的文件輸入到每個地圖任務。你最好做一個它的子類。 –

相關問題