2012-07-21 89 views
1

当我运行Hadoop作业(新API - 1.0.3)时,得到了ClassNotFoundException。 我有一个Main类包含静态MapClassReduceClass作为嵌套类。Hadoop无法找到映射程序

配置我的工作如下:

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.classMain$MapClass.classMain$ReduceClass.class文件bin项目文件夹的目录,我认为它应该是classpath的一部分。 但是工作是无法找到映射器类:

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) 

问题是什么?

+0

你如何运作你的工作? – Razvan 2012-07-21 07:44:42

+0

@Razvan:我从Eclipse运行我的工作 - Cntr + F11 – abhinavkulkarni 2012-07-21 07:47:39

+0

使用Hadoop安装目录/ bin目录中的hadoop脚本运行它 – Razvan 2012-07-21 07:48:45

回答

2

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

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

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

+0

工作正常。如果我将Eclipse项目作为jar导出并将其作为外部jar添加回项目,则该程序将运行。然而'Main.class','Main $ MapClass.class'和'Main $ ReduceClass.class'文件都在Eclipse项目的'bin'文件夹中,为什么不从那里选择呢?当我尝试添加这个'bin'文件夹作为外部库时,程序给出了同样的例外。看起来像添加jar是唯一的选择。 – abhinavkulkarni 2012-07-21 07:58:39

+2

因为你这样说:job.setJarByClass(Main.class); 而且没有这样的罐子 – Razvan 2012-07-21 08:01:48

0

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

相关问题