我已经使用amazon和hadoop与自定义jar实现了日志文件的mapreduce操作。
我的输出显示正确的键和值,但所有记录都显示在一行中。例如,给出以下对:
<1387, 2>
<1388, 1>
这就是打印:
1387 21388 1
这就是我所期待的:
1387 2
1388 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之间切换。看看是否有效。