Mapreduce输出显示同一行中的所有记录

时间:2014-09-11 16:24:20

标签: elastic-map-reduce

我已经使用amazon和hadoop与自定义jar实现了日志文件的mapreduce操作。

我的输出显示正确的键和值,但所有记录都显示在一行中。例如,给出以下对:

<1387, 2>
<1388, 1>

这就是打印:

1387     21388     1

这就是我所期待的:

1387     2
1388     1

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

为您清理代码:)

public static void main(String[] args) throws Exception {   
    JobConf conf = new JobConf(LogAnalyzer.class);
    conf.setJobName("Loganalyzer");
    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(IntWritable.class);
    conf.setMapperClass(LogAnalyzer.Map.class);
    conf.setCombinerClass(LogAnalyzer.Reduce.class);
    conf.setReducerClass(LogAnalyzer.Reduce.class);
    conf.setInputFormat(TextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);
    conf.set("mapreduce.textoutputformat.separator", "--");
    FileInputFormat.setInputPaths(conf, new Path(args[0])); 
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));
    JobClient.runJob(conf); 
}

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 void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
    String line = ((Text) value).toString(); 
    Matcher matcher = p.matcher(line); 
    if (matcher.matches()) { 
        String timestamp = matcher.group(4); 
        minute.set(getMinuteBucket(timestamp)); 
        output.collect(minute, ONE); //context.write(minute, one); 
    }
}

这不是hadoop-streaming,它只是一个普通的java工作。你应该修改问题上的标签。

这对我来说没问题,虽然你没有在一个类中使用mapper,我认为这是一个复制/粘贴遗漏。

关于线路结尾。我不认为你在看Windows上的输出?这可能是unix / windows line endings的问题。如果您在sublime或其他高级文本编辑器中打开文件,则可以在unix和windows之间切换。看看是否有效。