编写MApreduce代码来计算记录数

时间:2012-02-12 12:40:30

标签: hadoop mapreduce

我想编写一个mapreduce代码,用于计算给定CSV文件中的记录数量。我没有在地图中做什么,以及如何做以减少如何解决这个问题,任何人都可以提出建议?

6 个答案:

答案 0 :(得分:4)

  • 您的地图应为每个读取的记录发出1
  • 你的合成器应该发出所有“1”的总和(每个地图的子总数)
  • 你的减速器应该发出总记录数

答案 1 :(得分:3)

您的映射器必须发出固定密钥(只使用值为“count”的文本)固定值为1(与您在wordcount示例中看到的相同)。

然后只需使用LongSumReducer作为缩减器。

作业的输出将是一个记录,其键为“count”,值为您要查找的记录数。

您可以选择(戏剧性地!)通过使用相同的LongSumReducer作为合并器来提高性能。

答案 2 :(得分:1)

希望我有一个比接受的答案更好的解决方案。

不是为每条记录发出1,为什么不在map()中递增一个计数器,并在cleanup()中的每个map任务之后发出递增的计数器。

可以减少中间读写。而reducer只需聚合少量值列表。

public class LineCntMapper extends
  Mapper<LongWritable, Text, Text, IntWritable> {

 Text keyEmit = new Text("Total Lines");
 IntWritable valEmit = new IntWritable();
 int partialSum = 0;

 public void map(LongWritable key, Text value, Context context) {
  partialSum++;
 }

 public void cleanup(Context context) {
  valEmit.set(partialSum);

   context.write(keyEmit, valEmit);

 }
}

您可以找到完整的工作代码here

答案 3 :(得分:0)

使用 job.getcounters()检索作业完成后每条记录增加的值。如果您使用java编写mapreduce作业,请使用 enum 进行计数机制。

答案 4 :(得分:0)

import java.io.IOException;

import java.util.*;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.*;

import org.apache.hadoop.mapred.*;

public class LineCount 

{
    public static class Map extends MapReduceBase implements
            Mapper<LongWritable, Text, Text, IntWritable> 

{
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text("Total Lines");

    public void map(LongWritable key, Text value,
            OutputCollector<Text, IntWritable> output,Reporter reporter)
            throws IOException 
    {
        output.collect(word, one);
    }
}

public static class Reduce extends MapReduceBase implements
        Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterator<IntWritable> values,
            OutputCollector<Text, IntWritable> output, Reporter reporter)
            throws IOException {
        int sum = 0;
        while (values.hasNext()) {
            sum += values.next().get();
        }
        output.collect(key, new IntWritable(sum));
    }
}

public static void main(String[] args) throws Exception {
    JobConf conf = new JobConf(LineCount.class);

    conf.setJobName("LineCount");
    conf.setNumReduceTasks(5);
    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(IntWritable.class);

    conf.setMapperClass(Map.class);
    conf.setCombinerClass(Reduce.class);
    conf.setReducerClass(Reduce.class);

    conf.setInputFormat(TextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);

    FileInputFormat.setInputPaths(conf, new Path(args[0]));
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));

    JobClient.runJob(conf);
}
}

答案 5 :(得分:0)

我只使用身份Mapper和身份Reducer。

这是Mapper.class和Reducer.class。然后阅读map input records

你真的不需要做任何编码来获得这个。