2016-05-14 217 views
5

在爲我的MapReduce作業製作Jar時,我使用Hadoop-local命令輸入文件。我想知道是否有辦法,而不是專門爲我的輸入文件夾中的每個文件指定要用於MapReduce作業的路徑,而不管我是否可以指定並傳遞來自我的輸入文件夾的所有文件。這是因爲我想要配置的MapReduce作業的性質可能會改變文件的內容和數量,而且除了這些文件的內容之外,我不知道文件的具體數量,有沒有辦法將輸入文件夾中的所有文件傳遞到我的MapReduce程序中,然後迭代每個文件以計算某個函數,然後將結果發送給Reducer。我只使用一個Map/Reduce程序,而且我使用Java進行編碼。我可以使用hadoop-moonshot命令,但我現在正在使用hadoop-local。Hadoop,MapReduce - 多輸入/輸出路徑

謝謝。

+0

如果你指定你的工作的HDFS目錄,而不是一個文件,然後將所有文件應該被讀取。你可以請[編輯]你的問題,包括你正在運行的命令?也許在[mcve]中有一些代碼呢? –

+0

謝謝@ cricket_007你可能會提供一個調用HDFS目錄而不是單個文件的例子。另外,我怎麼會有每個輸入單獨的輸出文件。我猜是通過使用MultipleOutput類不知何故,但我現在看不到。 –

+0

我不記得如何輸出多個文件,但mapreduce輸出本身必須是一個目錄。至於目錄輸入,[wordcount示例](https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Usage)從一個目錄 –

回答

1

您不必通過單個文件作爲MapReduce作業的輸入。

FileInputFormat類已經提供了API來接受多個文件的列表作爲Input to Map Reduce程序。

public static void setInputPaths(Job job, 
       Path... inputPaths) 
          throws IOException 

添加路徑爲地圖,減少工作的投入列表。 參數:

的conf - 工作

路徑的配置 - 路徑被添加到了地圖,減少工作的投入列表。從Apache的tutorial

Job job = Job.getInstance(conf, "word count"); 
FileInputFormat.addInputPath(job, new Path(args[0])); 

MultipleInputs

實施例的代碼提供下面的API。

public static void addInputPath(Job job, 
       Path path, 
       Class<? extends InputFormat> inputFormatClass, 
       Class<? extends Mapper> mapperClass) 

添加路徑與自定義InputFormat和映射到的地圖,減少工作的投入列表。

相關SE問題:

Can hadoop take input from multiple directories and files

參考MultipleOutputs API有關您在多個輸出路徑第二個查詢。

FileOutputFormat.setOutputPath(job, outDir); 

// Defines additional single text based output 'text' for the job 
MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, 
LongWritable.class, Text.class); 

// Defines additional sequence-file based output 'sequence' for the job 
MultipleOutputs.addNamedOutput(job, "seq", 
SequenceFileOutputFormat.class, 
LongWritable.class, Text.class); 

查看關於多個輸出文件的相關SE問題。

Writing to multiple folders in hadoop?

hadoop method to send output to multiple directories

+0

您只拖動了一個示例代碼使用了一個輸入路徑 –

+0

除了在輸入/輸出同時說明的問題的標題外,OP在查詢體內都是作爲Input來查找多個文件。沒有提及輸出。後來我添加了setOutputPath API。 –

+0

雖然標題和問題並不完全匹配。所有被問到的是閱讀文件目錄。是的,這個代碼可以做到。我只是說你提到了多個路徑,但示例代碼不使用該方法 –