Hadoop无法找到Mapper

时间:2012-07-21 00:08:57

标签: hadoop mapreduce

当我运行Hadoop作业时,我得到ClassNotFoundException(新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) {
        ...
    }
}

我没有从项目中导出jar,因为Eclipse在项目文件夹的Main.class目录中创建了Main$MapClass.classMain$ReduceClass.classbin文件,我认为应该是类路径的一部分。 但是,该作业无法找到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)

有什么问题?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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