Как я могу использовать MultipleoutputFormai в Hadoop 0.20?

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

Вот мой код:

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? Я правильно использовал код?

2 ответа

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

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

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

Есть библиотека странностей. У них есть ряд реализаций выходного формата. Тот, который вы хотите, это MultipleLeafValueOutputFormat Записывает в файл, указанный ключом, и записывает только значение.

Теперь, скажем, вам нужно написать следующие пары, а ваш разделитель, скажем, символ табуляции ('\ t'):<"key1", "value1"> (вы хотите, чтобы это было записано в filename1)<"key2", " value2 "> (вы хотите, чтобы это было записано в filename2)

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

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

conf.setOutputFormat(MultipleLeafValueOutputFormat.class);

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

Другие вопросы по тегам