Ошибка при использовании одного вывода MapReduce в качестве другого ввода MapReduce - PullRequest
0 голосов
/ 16 апреля 2011
I have two Map/Reduce classes, named MyMappper1/MyReducer1 and MyMapper2/MyReducer2, and want to use the output of MyReducer1 as the input of MyMapper2, by setting the input path of job2 to the output path of job1.

Типы следующие:

    public class MyMapper1 extends Mapper<LongWritable, Text, IntWritable, IntArrayWritable>
    public class MyReducer1 extends Reducer<IntWritable, IntArrayWritable, IntWritable, IntArrayWritable>
    public class MyMapper2 extends Mapper<IntWritable, IntArrayWritable, IntWritable, IntArrayWritable>
    public class MyReducer2 extends Reducer<IntWritable, IntArrayWritable, IntWritable, IntWritable>

public class IntArrayWritable extends ArrayWritable {
    public IntArrayWritable() {
        super(IntWritable.class);
    }
}

А код для настройки пути ввода / вывода имеет вид:

    Path temppath = new Path("temp-dir-" + temp_time);

    FileOutputFormat.setOutputPath(job1, temppath);

            ...........

    FileInputFormat.addInputPath(job2, temppath);

Код для настройки ввода / выводаформат такой:

    job1.setOutputFormatClass(TextOutputFormat.class);
            ..........
    job2.setInputFormatClass(KeyValueTextInputFormat.class);

Однако я всегда получаю исключение при запуске job2:

11/04/16 12:34:09 WARN mapred.LocalJobRunner: job_local_0002
java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.IntWritable
    at ligon.MyMapper2.map(MyMapper2.java:1)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:646)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:322)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210)

Я пытался изменить InputFormat и OutputFormat, но безуспешно, похоже (хотя и нето же самое) исключение происходит в job2.

Мой полный пакет кода находится по адресу: http://dl.dropbox.com/u/7361939/HW2_Q1.zip

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2012

Я столкнулся с той же проблемой и нашел решение несколько минут назад. Поскольку вы используете IntArrayWritable как выход редуктора, его легко записать, а затем прочитать данные в двоичном виде.

Для первой работы:

    job1.setOutputFormatClass(SequenceFileOutputFormat.class);

    job1.setOutputKeyClass(IntWritable.class);
    job1.setOutputValueClass(IntArrayWritable.class);

Для второй работы:

    job2.setInputFormatClass(SequenceFileInputFormat.class);

Это должно работать в вашем случае

0 голосов
/ 17 апреля 2011

Проблема в том, что в задании 2 KeyValueTextInputFormat создает пары типа ключ-значение, и вы пытаетесь обработать их с помощью Mapper, который принимает, в результате чего возникает ClassCastException. Лучше всего поменять свой маппер на прием и преобразовать текст в целое число.

...