Я написал пользовательский inputformat и тип данных в hadoop, который может читать изображения, хранить их в массиве RGB. но когда я реализую на своей карте и уменьшаю функцию, управление не переходит к функции редуктора.
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class Image {
public static class Map extends Mapper<Text, ImageM, Text, ImageM> {
public void map(Text key, ImageM value, Context context) throws IOException,
InterruptedException {
/*
for(int i=0;i<value.Height;i++)
{
System.out.println();
for(int j=0;j<value.Width;j++)
{
System.out.print(" "+value.Blue[i][j]);
}
}
*/
context.write(key, value);
}
}
public static class Reduce extends Reducer<Text, ImageM, Text, IntWritable> {
public void reduce(Text key, ImageM value, Context context)
throws IOException, InterruptedException {
for(int i=0;i<value.Height;i++)
{
System.out.println();
for(int j=0;j<value.Width;j++)
{
System.out.print(value.Blue[i][j]+" ");
}
}
IntWritable m = new IntWritable(10);
context.write(key, m);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(ImageM.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(ImageFileInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
long start = new Date().getTime();
job.waitForCompletion(true);
long end = new Date().getTime();
System.out.println("Job took "+(end-start) + " milliseconds");
}
}
Здесь ключ в функции карты дает имя файла в соответствии с форматом ввода.
Я получаю вывод как "icon2.gif ImageM @31093d14"
Все прекрасно, если мой тип данных используется только в картографе. Можете угадать, где проблема?
Недопустимая сигнатура вашей функции. Должен быть:
@Override
public void reduce(Text key, Iterable<ImageM> values, Context context)
throws IOException, InterruptedException
Пожалуйста, используйте аннотацию @Override
чтобы компилятор @Override
эту ошибку для вас.