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