Java 空指针异常Hadoop

Java 空指针异常Hadoop,java,hadoop,nullpointerexception,Java,Hadoop,Nullpointerexception,您好,我目前正在编写一个MapReduce作业,以运行包含图像的hdfs,并记录文件是否包含红色的输出。我目前遇到了一个NullPointerException错误,我似乎不知道它是从哪里来的。下面是我的代码 { package hipi.examples.redfilter; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; import javax.image

您好,我目前正在编写一个MapReduce作业,以运行包含图像的hdfs,并记录文件是否包含红色的输出。我目前遇到了一个NullPointerException错误,我似乎不知道它是从哪里来的。下面是我的代码

{

package hipi.examples.redfilter;


import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.BooleanWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class RedFilter extends Configured implements Tool{
    private static String inputPath;
    public static class RedFilterMapper extends Mapper<NullWritable, BufferedImage, Text, BooleanWritable> {


        public void map(IntWritable key, BufferedImage currImage, Context content) throws IOException, InterruptedException
        {
            System.out.println("I am in the mapper method");
             FileSystem fs = FileSystem.get(new Configuration());
             FileStatus[] status = fs.listStatus(new Path(inputPath));
             System.out.println("I am in the mapper method");

             for (int i=0;i<status.length;i++){
                 String fileName = fs.open(status[i].getPath()).toString();
                  currImage= ImageIO.read(fs.open(status[i].getPath()));


               int width = currImage.getWidth();
               int height = currImage.getHeight();  
               boolean exit = false;

               for(int x = 0; x < width; x++) {
                   for(int y = 0; y < height; y++) {
                       Color c = new Color(currImage.getRGB(x, y));
                       int red = c.getRed();

                       if ( red > 200 && c.getBlue() < 100 && c.getGreen() < 100) {
                           content.write(new Text(fileName), new BooleanWritable(true));
                           exit = true;
                           break;

                       }

                   }
                   if(exit) {
                       break;
                   }
               }
               if(!exit) {
                 content.write(new Text(fileName), new BooleanWritable(false)); 
               }


         }

        }       

    }

    public int run(String[] args) throws Exception {
        Configuration conf = new Configuration();
        if (args.length < 3) {
            System.out.println("Usage: dumphib <input hib> <outputdir>");
            System.exit(0);
        }
        inputPath = args[1];
        String outputPath = args[2];

        Job job = new Job(conf, "refilter");
        System.out.println("Jar Files r being set");
        job.setJarByClass(RedFilter.class);
        System.out.println("Mapper is being set");
        job.setMapperClass(RedFilterMapper.class);


        // Set formats
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Boolean.class);
//      job.setInputFormatClass(ImageBundleInputFormat.class);

        // Set out/in paths
        removeDir(outputPath, conf);
        FileOutputFormat.setOutputPath(job, new Path(outputPath));
        FileInputFormat.setInputPaths(job, new Path(inputPath));    

        job.setNumReduceTasks(1);
        System.exit(job.waitForCompletion(true) ? 0 : 1);
        return 0;

    }

    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new RedFilter(), args);
        System.exit(exitCode);
    }

    public static void removeDir(String path, Configuration conf) throws IOException {
        Path output_path = new Path(path);

        FileSystem fs = FileSystem.get(conf);

        if (fs.exists(output_path)) {
            fs.delete(output_path, true);
        }
    }


}

}
{
包hipi.examples.redfilter;
导入java.awt.Color;
导入java.awt.image.buffereImage;
导入java.io.IOException;
导入javax.imageio.imageio;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.conf.Configured;
导入org.apache.hadoop.fs.FileStatus;
导入org.apache.hadoop.fs.FileSystem;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.io.BooleanWritable;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.NullWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Job;
导入org.apache.hadoop.mapreduce.Mapper;
导入org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
导入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
导入org.apache.hadoop.util.Tool;
导入org.apache.hadoop.util.ToolRunner;
公共类RedFilter扩展配置的实现工具{
私有静态字符串输入路径;
公共静态类RedFilterMapper扩展映射器{
公共void映射(IntWritable键、BuffereImage currImage、上下文内容)引发IOException、InterruptedException
{
System.out.println(“我在映射器方法中”);
FileSystem fs=FileSystem.get(新配置());
FileStatus[]status=fs.listStatus(新路径(inputPath));
System.out.println(“我在映射器方法中”);
对于(int i=0;i 200&&c.getBlue()<100&&c.getGreen()<100){
write(新文本(文件名),新布尔可写(true));
退出=真;
打破
}
}
如果(退出){
打破
}
}
如果(!退出){
write(新文本(文件名),新布尔可写(false));
}
}
}       
}
公共int运行(字符串[]args)引发异常{
Configuration conf=新配置();
如果(参数长度<3){
System.out.println(“用法:dumphib”);
系统出口(0);
}
inputPath=args[1];
字符串outputPath=args[2];
作业作业=新作业(配置,“重新筛选”);
System.out.println(“正在设置Jar文件”);
job.setJarByClass(RedFilter.class);
System.out.println(“正在设置映射器”);
setMapperClass(RedFilterMapper.class);
//设置格式
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Boolean.class);
//setInputFormatClass(ImageBundleInputFormat.class);
//设置/设置路径
removeDir(outputPath,conf);
setOutputPath(作业,新路径(outputPath));
setInputPath(作业,新路径(inputPath));
作业。setNumReduceTasks(1);
系统退出(作业等待完成(真)?0:1;
返回0;
}
公共静态void main(字符串[]args)引发异常{
int exitCode=ToolRunner.run(新的RedFilter(),args);
系统退出(退出代码);
}
公共静态void removeDir(字符串路径,配置配置)引发IOException{
路径输出\路径=新路径(路径);
FileSystem fs=FileSystem.get(conf);
如果(fs.存在(输出路径)){
fs.delete(输出路径,true);
}
}
}
}
以下是作业跟踪器的日志结果

{

stdout logs


stderr logs
2014-11-23 23:25:19.979 java[6176:1003] Unable to load realm info from SCDynamicStore


syslog logs
2014-11-23 23:25:20,740 WARN org.apache.hadoop.util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2014-11-23 23:25:21,569 WARN org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Source name ugi already exists!
2014-11-23 23:25:21,727 INFO org.apache.hadoop.mapred.Task:  Using ResourceCalculatorPlugin : null
2014-11-23 23:25:21,759 INFO org.apache.hadoop.mapred.MapTask: Processing split: hdfs://localhost/user/oladotunopasina/redfilterinput/31b5ea5d982cf2b8b4ce27744d812d285b9e3.jpg:0+684033
2014-11-23 23:25:21,778 INFO org.apache.hadoop.mapred.MapTask: io.sort.mb = 100
2014-11-23 23:25:22,119 INFO org.apache.hadoop.mapred.MapTask: data buffer = 79691776/99614720
2014-11-23 23:25:22,119 INFO org.apache.hadoop.mapred.MapTask: record buffer = 262144/327680
2014-11-23 23:25:22,222 INFO org.apache.hadoop.mapred.TaskLogsTruncater: Initializing logs' truncater with mapRetainSize=-1 and reduceRetainSize=-1
2014-11-23 23:25:22,481 WARN org.apache.hadoop.mapred.Child: Error running child
java.lang.NullPointerException
    at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:970)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:394)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
2014-11-23 23:25:22,485 INFO org.apache.hadoop.mapred.Task: Runnning cleanup for the task

}
{
标准日志
标准测井曲线
2014-11-23 23:25:19.979 java[6176:1003]无法从SCDynamicStore加载领域信息
系统日志
2014-11-23 23:25:20740警告org.apache.hadoop.util.NativeCodeLoader:无法为您的平台加载本机hadoop库…在适用的情况下使用内置java类
2014-11-23 23:25:21569警告org.apache.hadoop.metrics2.impl.metricsystemimpl:源名称ugi已存在!
2014-11-23 23:25:21727 INFO org.apache.hadoop.mapred.Task:使用ResourceCalculatorPlugin:null
2014-11-23 23:25:21759 INFO org.apache.hadoop.mapred.MapTask:处理拆分:hdfs://localhost/user/oladotunopasina/redfilterinput/31b5ea5d982cf2b8b4ce27744d812d285b9e3.jpg:0+684033
2014-11-23 23:25:21778 INFO org.apache.hadoop.mapred.MapTask:io.sort.mb=100
2014-11-23 23:25:22119 INFO org.apache.hadoop.mapred.MapTask:data buffer=79691776/99614720
2014-11-23 23:25:22119 INFO org.apache.hadoop.mapred.MapTask:record buffer=262144/327680
2014-11-23 23:25:2222 INFO org.apache.hadoop.mapred.TaskLogsTruncater:使用mapRetainSize=-1和reduceRetainSize=-1初始化日志的截断器
2014-11-23 23:25:22481警告org.apache.hadoop.mapred.Child:运行Child时出错
java.lang.NullPointerException
位于org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
位于org.apache.hadoop.mapred.MapTask$MapOutputBuffer。(MapTask.java:970)
位于org.apache.hadoop.mapred.MapTask$NewOutputCollector。(MapTask.java:673)
位于org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
位于org.apache.hadoop.mapred.Child$4.run(Child.java:255)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAs(Subject.java:394)
位于org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
位于org.apache.hadoop.mapred.Child.main(Child.java:249)
2014-11-23 23:25:22485 INFO org.apache.hadoop.mapred.Task:为任务运行清理
}

请帮忙。

我发现行中有一个错误:

job.setOutputValueClass(Boolean.class);
您应将其替换为:

job.setOutputValueClass(BooleanWritable.class);

我认为hadoop在找不到
Boolean
对象的序列化程序时会失败。

为什么
job.setInputFormatClass