Hadoop,MapReduce - 多个输入/输出路径

时间:2016-05-14 17:16:56

标签: java hadoop mapreduce

在为我的MapReduce作业制作Jar的输入文件中,我使用的是Hadoop-local命令。我想知道是否有一种方法,而不是专门为我在MapReduce作业中使用的输入文件夹中的每个文件指定路径,是否可以指定并传递输入文件夹中的所有文件。这是因为我试图配置的MapReduce作业的性质,文件的内容和数量可能会改变,因为我不知道具体的文件数量,除了这些文件的内容,是否有办法将所有文件从输入文件夹传递到我的MapReduce程序,然后遍历每个文件以计算某个函数,然后将结果发送到Reducer。我只使用一个Map / Reduce程序,而且我用Java编写代码。我可以使用hadoop-moonshot命令,但我现在正在使用hadoop-local。

感谢。

1 个答案:

答案 0 :(得分:1)

您不必将单个文件作为MapReduce作业的输入传递。

FileInputFormat类已经提供了API来接受多个文件的列表作为Map Reduce程序的输入。

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

将路径添加到map-reduce作业的输入列表中。   参数:

     

conf - 作业的配置

     

path - 要添加到map-reduce作业的输入列表的路径。

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和Mapper的路径添加到map-reduce作业的输入列表中。

相关的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