我是Hadoop的新手,我设法运行了wordCount示例:http://hadoop.apache.org/common/docs/r0.18.2/mapred_tutorial.html

假设我们有一个包含3个文件的文件夹。我希望每个文件都有一个映射器,该映射器将只计算行数并将其返回给reducer。

然后,reducer将每个映射器的行数作为输入,并将所有3个文件中存在的行总数作为输出。

所以如果我们有以下3个文件

input1.txt
input2.txt
input3.txt

映射器返回:
mapper1 -> [input1.txt, 3]
mapper2 -> [input2.txt, 4]
mapper3 -> [input3.txt, 9]

reducer 的输出为
3+4+9 = 16

我已经在一个简单的Java应用程序中完成了此操作,因此我想在Hadoop中执行此操作。我只有1台计算机,想尝试在伪分布式环境中运行。

我怎样才能做到这一点?我应该采取什么适当的步骤?

我的代码在apache示例中应该看起来像吗?我将有两个静态类,一个用于mapper,一个用于reducer?还是我应该有3个类(class),每个映射者一个类(class)?

如果可以的话,请指导我,我不知道该怎么做,我相信,如果我能够编写一些代码来完成这些工作,那么将来我将能够编写更复杂的应用程序。

谢谢!

最佳答案

除了sa125的答案,您可以通过不为每个输入记录发出记录,而只是在映射器中累积一个计数器,然后在映射器清除方法中,发送文件名和计数值,从而极大地提高性能:

public class LineMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
    protected long lines = 0;

    @Override
    protected void cleanup(Context context) throws IOException,
            InterruptedException {
        FileSplit split = (FileSplit) context.getInputSplit();
        String filename = split.getPath().toString();

        context.write(new Text(filename), new LongWritable(lines));
    }

    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        lines++;
    }
}

07-28 01:45
查看更多