2013-09-25 2 views
1

Я работаю с Hadoop 0.20, и я хочу, чтобы два выходных файла сокращения вместо одного выхода. Я знаю, что MultipleOutputFormat не работает в Hadoop 0.20. Я добавил файл базы данных hadoop1.1.1-core в пути сборки моего проекта в Eclipse. Но он все еще показывает последнюю ошибку.Как использовать MultipleoutputFormai в Hadoop 0.20?

Вот мой код:

public static class ReduceStage extends Reducer<IntWritable, BitSetWritable, IntWritable, Text> 
{ 
    private MultipleOutputs mos; 
    public ReduceStage() { 
     System.out.println("ReduceStage"); 
    } 

    public void setup(Context context) { 
     mos = new MultipleOutputs(context); 
    } 

    public void reduce(final IntWritable key, final Iterable<BitSetWritable> values, Context output) throws IOException, InterruptedException 
    { 
     mos.write("text1", key, new Text("Hello")); 
    } 

    public void cleanup(Context context) throws IOException { 
     try { 
      mos.close(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

А в перспективе():

FileOutputFormat.setOutputPath(job, ConnectedComponents_Nodes); 
job.setOutputKeyClass(MultipleTextOutputFormat.class); 
MultipleOutputs.addNamedOutput(job, "text1", TextOutputFormat.class, 
       IntWritable.class, Text.class); 

Ошибка:

java.lang.NoSuchMethodError: org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.setOutputName(Lorg/apache/hadoop/mapreduce/JobContext;Ljava/lang/String;)V 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.getRecordWriter(MultipleOutputs.java:409) 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:370) 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:348) 
at bitsetmr$ReduceStage.reduce(bitsetmr.java:179) 
at bitsetmr$ReduceStage.reduce(bitsetmr.java:1) 
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176) 
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:566) 
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:408) 
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:216) 

Что я могу сделать, чтобы иметь MultipleOutputFormat? Правильно ли я использовал код?

+0

Здание с 1.1.1, но работает в 0.20 не работает. На самом деле сначала загружается 0,20, а 1.1.1 не может переопределить 0,20. – zsxwing

+0

@zsxwing: Итак, как я могу использовать multipleoutputformat в hadoop 0.20? –

+0

Вам необходимо скопировать эти коды в свой проект или обновить хаоп. – zsxwing

ответ

0

Вы можете перейти на переопределенное расширение MultipleTextOutputFormat, а затем сделать все содержимое записи частью «значения», в то время как ключ или путь к имени файла или пути.

Существует библиотека oddjob. Они имеют ряд выходных форматов. Тот, который вы хотите, - MultipleLeafValueOutputFormat: Записывает файл, указанный ключом, и записывает только значение.

Теперь, говорят, что вы должны написать следующие пары и ваш разделитель говорят символ табуляции («\ т»): < «key1», «value1»> (Вы хотите, чтобы это было написано в имяфайла1) < "key2", "значение2"> (вы хотите, чтобы это было написано в имя_файла2)

Итак, теперь выход из редуктора будет трансформироваться в следующем: < "filename1", "key1 \ tvalue1"> < " filename2 "," key2 \ tvalue2 ">

Кроме того, не забывайте, что вышеуказанный класс следует добавить как класс outformat к работе:

conf.setOutputFormat(MultipleLeafValueOutputFormat.class); 

Одна вещь, чтобы отметить здесь, что вам нужно будет работать со старым mapred пакета, а не mapreduce пакетом. Но это не должно быть проблемой.

+0

@Anar Я хочу иметь два файла seprate. –

+0

Да, это даст вам два отдельных файла: 'filename1' и' filename2'! – Amar

0

Во-первых, вы должны убедиться, что FileOutputFormat.setOutputName имеет тот же код между версиями 0.20 и 1.1.1. Если нет, у вас должна быть совместимая версия для компиляции кода. Если то же самое, в вашей команде должна быть некоторая ошибка параметра.

Я столкнулся с той же проблемой, и я удалил -Dmapreduce.user.classpath.first=true из команды запуска, и она работает. надеюсь, это поможет!

Смежные вопросы