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

时间:2012-01-16 21:08:25

标签: java hadoop mapreduce

我是Hadoop的新手,我正在试图弄清楚它是如何工作的。至于练习,我应该实现类似于WordCount-Example的东西。任务是读入几个文件,执行WordCount并为每个输入文件写一个输出文件。 Hadoop使用组合器并将map-part的输出作为reducer的输入进行混洗,然后写入一个输出文件(我想每个正在运行的实例)。我想知道是否可以为每个输入文件写一个输出文件(所以保留inputfile1的单词并将结果写入outputfile1,依此类推)。是否有可能覆盖Combiner-Class或者是否有其他解决方案(我不确定这是否应该在Hadoop-Task中解决,但这是练习)。

谢谢...

2 个答案:

答案 0 :(得分:1)

map.input.file environment参数具有映射器正在处理的文件名。在映射器中获取此值,并将其用作映射器的输出键,然后将单个文件中的所有k / v用作一个reducer。

映射器中的代码。顺便说一句,我使用的是旧的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,这允许为作业写入多个输出文件。文件名可以从输出键和值派生。

答案 1 :(得分:0)

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

我有一个非常相似的约束;我需要一组文件(链中的先前reducer的输出)完全由单个映射器处理。我在我的解决方案中使用< 64MB事实 我的解决方案的主要目的是我将其设置为向映射器提供它需要处理的文件名,并且映射器的内部使其加载/读取文件。这允许单个映射器处理整个文件 - 它不是文件的分布式处理,但是具有“我不希望分发单个文件”的约束 - 它可以工作。 :)

我有启动我的MR的过程写出要处理成单个文件的文件的文件名。这些文件的编写位置是输入目录。由于每个文件都小于64MB,因此将为每个文件生成一个映射器。 map进程将被调用一次(因为文件中只有一个条目) 然后我将传递给mapper的值取出并打开文件并执行我需要做的任何映射。 由于hadoop试图巧妙地了解Map / Reduce进程的处理方式,因此可能需要指定要使用的reducers数量,以便每个映射器转到一个reducer。这可以通过mapred.reduce.tasks配置进行设置。我通过job.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);

执行此操作

我的流程有一些额外的要求/限制,可能使这个特定的解决方案吸引人;但是对于1:in到1:out的例子;我已经完成了,上面列出了基础知识。

HTH