2013-04-09 3 views
3

Я выполняю две задания MapReduce, и я хочу, чтобы второе задание могло записать мой результат в два разных файла в двух разных каталогах. Я хотел бы что-то подобное FileInputFormat.addInputPath (.., несколько путей ввода) в некотором смысле, но для вывода.Несколько выходных путей (Java - Hadoop - MapReduce)

Я совершенно новой для MapReduce, и у меня есть своя специфика, чтобы написать свой код в Hadoop 0.21.0 Я использую context.write(..) в моем Reduce шаг, но я не вижу, как управлять несколькими путями вывода ...

Спасибо за ваше время!

My reduceCode с моей первой работы, чтобы показать вам, что я знаю только, как выводить (он входит в файл /../part*. Но теперь я хотел бы указать два файла-прецизии для разных выход, в зависимости от ключа):

public static class NormalizeReducer extends Reducer<LongWritable, NetflixRating, LongWritable, NetflixUser> { 
    public void reduce(LongWritable key, Iterable<NetflixRating> values, Context context) throws IOException, InterruptedException { 
     NetflixUser user = new NetflixUser(key.get()); 
     for(NetflixRating r : values) { 
      user.addRating(new NetflixRating(r)); 
     } 
     user.normalizeRatings(); 
     user.reduceRatings(); 
     context.write(key, user); 
    } 
} 

EDIT: поэтому я сделал метод в последний комментарий, как вы упомянули, Амар. Я не знаю, если это работает, у меня есть другая проблема с моим HDFS, но прежде, чем я забываю давайте здесь мои открытия для цивилизации:

http://archive.cloudera.com/cdh/3/hadoop-0.20.2+228/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html

  • MultipleOutputs не действует на месте FormatOutputFormat. Вы определяете один выходной путь с помощью FormatOutputFormat, а затем вы можете добавить еще много с несколькими MultipleOutput.
  • addNamedOutput method: String namedOutput - это просто слово, которое описывает.
  • Вы определяете путь, фактически используемый в методе write, аргумент String baseOutputPath.
+0

checkout 'MultipleOutputs': http://archive.cloudera.com/cdh/3/hadoop-0.20.2+228/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html – Amar

+0

Похож, что Это! Я не знаю, как я этого не нашел ... Я попробую это спасибо! – Hermes

+0

Вопрос еще: мы можем только добавить слово, чтобы описать путь, скажем, документацию, почему это так? Почему мы не можем поставить полный путь, чтобы иметь возможность выводить в разных каталогах? – Hermes

ответ

2

поэтому я сделал метод в последнем комментарии, как вы упомянули, Амар. Я не знаю, если это работает, у меня есть другая проблема с моим HDFS, но прежде, чем я забываю давайте здесь мои открытия для цивилизации:

http://archive.cloudera.com/cdh/3/hadoop-0.20.2+228/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html

MultipleOutputs НЕ действовать вместо FormatOutputFormat. Вы определяете один выходной путь с помощью FormatOutputFormat, а затем вы можете добавить еще много с несколькими MultipleOutput. addNamedOutput method: String namedOutput - это просто слово, которое описывает. Вы определяете путь, фактически используемый в методе write, аргумент baseNotputPath.