2014-09-11 2 views
0

Я реализовал операцию mapreduce для файла журнала, используя амазонку и хауп с пользовательским банком.Выход Mapreduce, показывающий все записи в той же строке

Мой вывод показывает правильные ключи и значения, но все записи отображаются в одной строке. Например, учитывая следующие пары:

<1387, 2> 
<1388, 1> 

Это то, что печать:

1387  21388  1 

Это то, что я ожидал:

1387  2 
1388  1 

Как я могу это исправить?

+0

Не могли бы вы показать код, в котором вы распечатываете записи? Как бы то ни было, мы не знаем, что вы делаете! (Я предполагаю, что вы пропустили добавление символа новой строки) –

+0

государственной статической силы основных (String [] арг) броски Exception {\t \t \t \t \t \t JobConf конф = новый JobConf (LogAnalyzer.class); \t \t conf.setJobName («Loganalyzer»); \t \t conf.setOutputKeyClass (Text.class); \t \t conf.setOutputValueClass (IntWritable.class); \t \t conf.setMapperClass (LogAnalyzer.Map.class); \t \t conf.setCombinerClass (LogAnalyzer.Reduce.class); \t \t conf.setReducerClass (LogAnalyzer.Reduce.class); conf.setInputFormat (TextInputFormat.class); \t \t conf.setOutputFormat (TextOutputFormat.class); \t \t conf.set ("mapreduce.textoutputformat.separator", "-"); –

+0

FileInputFormat.setInputPaths (conf, new Path (args [0])); \t \t FileOutputFormat.setOutputPath (conf, new Path (args [1])); \t \t JobClient.runJob (CONF); \t \t \t \t} –

ответ

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-потоковый, это просто нормальная работа Java. Вы должны изменить тег на вопрос.

Это выглядит хорошо для меня, хотя у вас нет картографа внутри класса, который, как я полагаю, является ошибкой копирования/вставки.

Что касается окончаний линии. Я не думаю, что вы смотрите на выход в Windows? Это может быть проблемой с окончанием строки unix/windows. Если вы откроете файл в возвышенном или другом расширенном текстовом редакторе, вы можете переключаться между unix и windows. Посмотрите, работает ли это.