1

ClassNotFoundException当我运行我的 Hadoop 作业(新 API - 1.0.3)时,我得到了。我有一个Main包含静态类MapClassReduceClass嵌套类的类。

我将我的工作配置如下:

    Job job = new Job();

    job.setJarByClass(Main.class);
    job.setJobName("My Job");

    job.setMapperClass(Main.MapClass.class);
    job.setReducerClass(Main.ReduceClass.class);

主类如下:

public class Main {
    //Nested static Mapper
public static class MapClass extends Mapper<Text, Text, Text, Text> {

    @Override
    public void map(Text key, Text value, Context context) {
            ...
    }
}

    // Nested static Reducer
public static class ReduceClass extends Reducer<Text, Text, Text, Text> {

    @Override
    public void reduce(Text key, Iterable<Text> values, Context context) {
        ...
    }
}

我没有在 Eclipse 创建Main.class时从项目中导出 jarMain$MapClass.class和项目Main$ReduceClass.class文件bin夹目录中的文件,我认为这应该是类路径的一部分。但是该作业无法找到 Mapper 类:

java.lang.RuntimeException: java.lang.ClassNotFoundException: MapClass
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:867)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
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:416)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)

问题是什么?

4

2 回答 2

2

尝试导出项目的 jar 文件。然后在以下命令中使用这个 jar:

hadoop jar "jar name" package.subpackage.DriverClass [-conf configXML] 
inputDir outputDir

Driver 类是 MainClass。conf 选项是可选的,但建议使用,它指定了一个文件,您可以在其中设置特定的配置选项。

于 2012-07-21T07:51:20.100 回答
0

如果您在 Eclipse 中作为 Java 应用程序运行,则 Eclipse 不会将所有需要的文件(即MapperReducerHadoop)发送到 Hadoop。使用 Eclipse Plugin for Hadoop 从 Eclipse 直接在 Hadoop 中运行应用程序。

于 2013-12-31T23:59:00.663 回答