Java 由于ClassNotFound,CDH Hadoop无法执行Hadoop作业

Java 由于ClassNotFound,CDH Hadoop无法执行Hadoop作业,java,hadoop,Java,Hadoop,演示非常简单。使用hadoop jar hia-1.0-SNAPSHOT.jar cha1.CharCount运行它时,它会失败,出现异常: Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class cha1.CharCount$CMapper not found at org.apache.hadoop.conf.Configuration.getClass(Configuration.java

演示非常简单。使用hadoop jar hia-1.0-SNAPSHOT.jar cha1.CharCount运行它时,它会失败,出现异常:

Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class cha1.CharCount$CMapper not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1587)
    at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:715)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:338)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:157)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:152)
Caused by: java.lang.ClassNotFoundException: Class cha1.CharCount$CMapper not found
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1493)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1585)
    ... 8 more
这是演示代码

package cha1;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.ByteWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * User: mzang
 * Date: 10/31/13
 * Time: 4:21 PM
 */
public class CharCount extends Configured implements Tool {

    class CMapper extends Mapper<LongWritable, Text, ByteWritable, LongWritable> {

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            byte[] content = value.getBytes();
            Map<ByteWritable, Integer> map = new HashMap<ByteWritable, Integer>();
            for (byte b : content) {
                ByteWritable bw = new ByteWritable(b);
                Integer c = map.get(bw);
                if (c == null) {
                    map.put(bw, 1);
                } else {
                    c++;
                    map.put(bw, c);
                }
            }
            for (Map.Entry<ByteWritable, Integer> entry : map.entrySet()) {
                context.write(entry.getKey(), new LongWritable(entry.getValue()));
            }
        }
    }

    class CCombiner extends Reducer<ByteWritable, LongWritable, ByteWritable, LongWritable> {

        @Override
        protected void reduce(ByteWritable key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {

            long sum = 0;
            for (LongWritable longWritable : values) {
                sum += longWritable.get();
            }

            context.write(key, new LongWritable(sum));

        }
    }

    class CReducer extends Reducer<ByteWritable, LongWritable, Text, Text> {

        @Override
        protected void reduce(ByteWritable key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {

            long sum = 0;
            for (LongWritable longWritable : values) {
                sum += longWritable.get();
            }

            context.write(new Text(String.valueOf(key.get())), new Text(String.valueOf(sum)));
        }
    }

    public int run(String[] args) throws IOException, ClassNotFoundException, InterruptedException {


        Job job = Job.getInstance(this.getConf());
        FileOutputFormat.setOutputPath(job, new Path("/tmp/test/output"));

        FileInputFormat.setInputPaths(job, new Path("/tmp/test/input"));

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        job.setMapperClass(CMapper.class);
        job.setCombinerClass(CCombiner.class);
        job.setReducerClass(CReducer.class);

        job.submit();

        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.addResource("hdfs-site.xml");
        int res = ToolRunner.run(conf, new CharCount(), args);

        System.exit(res);
    }

}
包cha1;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.conf.Configured;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.io.ByteWritable;
导入org.apache.hadoop.io.LongWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Job;
导入org.apache.hadoop.mapreduce.Mapper;
导入org.apache.hadoop.mapreduce.Reducer;
导入org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
导入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
导入org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
导入org.apache.hadoop.util.Tool;
导入org.apache.hadoop.util.ToolRunner;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.Map;
/**
*用户:mzang
*日期:2013年10月31日
*时间:下午四时二十一分
*/
公共类CharCount扩展配置的实现工具{
类CMapper扩展映射器{
@凌驾
受保护的void映射(LongWritable键、文本值、上下文)引发IOException、InterruptedException{
字节[]内容=值。getBytes();
Map Map=newhashmap();
for(字节b:内容){
字节可写bw=新的字节可写(b);
整数c=map.get(bw);
如果(c==null){
map.put(bw,1);
}否则{
C++;
map.put(bw,c);
}
}
对于(Map.Entry:Map.entrySet()){
write(entry.getKey(),新的LongWritable(entry.getValue());
}
}
}
类CCombiner扩展了Reducer{
@凌驾
受保护的void reduce(字节可写键、Iterable值、上下文)引发IOException、InterruptedException{
长和=0;
for(LongWritable LongWritable:值){
sum+=longWritable.get();
}
write(key,新的LongWritable(sum));
}
}
类CReducer扩展减速器{
@凌驾
受保护的void reduce(字节可写键、Iterable值、上下文)引发IOException、InterruptedException{
长和=0;
for(LongWritable LongWritable:值){
sum+=longWritable.get();
}
write(新文本(String.valueOf(key.get())),新文本(String.valueOf(sum));
}
}
public int run(字符串[]args)抛出IOException、ClassNotFoundException、InterruptedException{
Job Job=Job.getInstance(this.getConf());
setOutputPath(作业,新路径(“/tmp/test/output”);
setInputPaths(作业,新路径(“/tmp/test/input”);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
setOutputFormatClass(TextOutputFormat.class);
job.setMapperClass(CMapper.class);
job.setCombinerClass(CCombiner.class);
job.setReducerClass(CReducer.class);
job.submit();
返回作业。waitForCompletion(true)?0:1;
}
公共静态void main(字符串[]args)引发异常{
Configuration conf=新配置();
conf.addResource(“hdfs site.xml”);
int res=ToolRunner.run(conf,new CharCount(),args);
系统退出(res);
}
}
它应该可以在ApacheHadoop上运行

我查看了hadoop日志。它什么也没说,但很多尝试都失败了

然后我尝试检查
hadoop fs-ls/tmp/hadoop-warn/staging/history/
。但是两个目录done和done是空的


jar应该分发给hdfs,并由每个任务跟踪器下载,对吗?Class CharCount$CMapper应该在jar中。

Make
CMapper
public
。它不是
static
这一事实意味着Hadoop无法创建实例,因为它不知道它是
CharCount

的内部类。您是否使用了job.setJarByClass(CharCount.class)?查看[[1]:我认为他必须为CReducer、CCombiner类添加公共访问权限,对吗?尝试添加
公共静态
,并尝试将类移出。得到相同的异常,但类名不同:
类cha1.CharCount$CMapper未找到
类cha1.CMapper未找到