Java Hadoop MapReduce-每个输入一个输出文件

Java Hadoop MapReduce-每个输入一个输出文件,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我是Hadoop的新手,我正在尝试弄清楚它是如何工作的。作为一个练习,我应该实现一些类似于WordCount示例的东西。任务是读入几个文件,进行字数统计,并为每个输入文件编写一个输出文件。 Hadoop使用一个组合器,将映射部分的输出洗牌作为reducer的输入,然后编写一个输出文件(我猜是针对每个正在运行的实例)。我想知道是否有可能为每个输入文件编写一个输出文件(因此保留inputfile1的单词,并将结果写入outputfile1,依此类推)。是否可以覆盖Combiner类,或者是否有其他解

我是Hadoop的新手,我正在尝试弄清楚它是如何工作的。作为一个练习,我应该实现一些类似于WordCount示例的东西。任务是读入几个文件,进行字数统计,并为每个输入文件编写一个输出文件。 Hadoop使用一个组合器,将映射部分的输出洗牌作为reducer的输入,然后编写一个输出文件(我猜是针对每个正在运行的实例)。我想知道是否有可能为每个输入文件编写一个输出文件(因此保留inputfile1的单词,并将结果写入outputfile1,依此类推)。是否可以覆盖Combiner类,或者是否有其他解决方案(我不确定是否应该在Hadoop任务中解决这个问题,但这是一个练习)


谢谢

Hadoop将数据“分块”成配置大小的块。默认值为64MB块。您可能会看到这会导致您的方法出现问题;每个映射者只能得到一个文件的一部分。如果文件小于64MB(或配置的任何值),则每个映射器将仅获取1个文件


我有一个非常相似的约束;我需要一组文件(从链中以前的reducer中输出)完全由一个映射器处理。我使用的
map.input.file
环境参数具有映射程序正在处理的文件名。在映射器中获取该值,并将其用作映射器的输出键,然后将单个文件中的所有k/v转换为一个减速机

映射程序中的代码。顺便说一句,我使用的是旧的MR API

@Override
public void configure(JobConf conf) {
    this.conf = conf;
}

@Override.
public void map(................) throws IOException {

        String filename = conf.get("map.input.file");
        output.collect(new Text(filename), value);
}

并使用MultipleOutputFormat,这允许为作业写入多个输出文件。文件名可以从输出键和值派生。

谢谢您的输入。使用setNumReduceTasks,我可以获得所需的任意多个输出文件。但是,还原器的输入仍然是混合/无序的。我确实检查了映射器的输出,似乎一个映射器正在处理两个文件(但这不应该是问题)。但是,仅处理一个文件的映射程序的结果也会与其他映射程序的结果混合。我可以阻止Hadoop这样做吗(shuffle/combine?可能设置combinerclass?)您是否只是获取了所有文件名并将它们传递给映射器?还是我遗漏了什么?可能需要设置另一个conf值?要强制使用特定的reducer,请让每个映射器在写入输出时使用特定的键。相同的键将转到相同的映射器。您可以在conf中为每个作业传递不同的值,然后将该值用作键。根据我的经验,这将导致每个映射器的输出都到一个reducer。将文件名传递给映射器以便由一个映射器处理文件不是有效的方法。没有数据本地化,数据将更加混乱。解决这个问题的一种方法是将依赖文件捆绑到1(gz,tar)中,并从FileInputFormat#isSplitable方法返回false。谢谢,我认为这是最好的主意。也许我会使用旧的API,因为它似乎更容易处理,但首先我会看看0.20