2015-11-11 59 views
0

我正在使用Hadoop 2.7.1並使用Java進行編碼。我能夠運行一個簡單的mapreduce程序,我提供一個文件夾作爲MapReduce程序的輸入。如何使用文件(許多文件的完整路徑)作爲MapReduce作業的輸入

但是我想用一個文件(完整路徑在裏面)作爲輸入;此文件包含要由映射器函數處理的所有其他文件。

以下是文件內容,

/allfiles.txt 
    - /tmp/aaa/file1.txt 
    - /tmp/bbb/file2.txt 
    - /tmp/ccc/file3.txt 

如何指定輸入路徑的MapReduce程序的文件,以便它可以開始處理每一個文件?謝謝。

回答

0

在你的驅動程序類,你可以在文件中讀取,並加入每行輸入一個文件:

//Read allfiles.txt and put each line into a List (requires at least Java 1.7) 
List<String> files = Files.readAllLines(Paths.get("allfiles.txt"), StandardCharsets.UTF_8); 

/Loop through the file names and add them as input 
for(String file : files) { 
    //This Path is org.apache.hadoop.fs.Path 
    FileInputFormat.addInputPath(conf, new Path(file)); 
} 

這是假設你的allfiles.txt是本地的,你的MR工作是節點正在運行,但如果allfiles.txt實際上位於HDFS上,這只是一個小小的改變。

我強烈建議您在將HDFS作爲輸入添加之前檢查每個文件是否存在於HDFS上。

0

您可以使用globs而不是創建一個包含其他文件路徑的文件。

在你的例子中,你可以定義你的輸入爲-input /tmp/*/file?.txt

相關問題