当我运行Hadoop作业时,我得到ClassNotFoundException
(新API - 1.0.3)。
我有一个Main
类,其中包含静态MapClass
和ReduceClass
作为嵌套类。
我按如下方式配置我的工作:
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.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)
有什么问题?
答案 0 :(得分:2)
尝试导出项目的jar文件。然后在以下命令中使用此jar:
hadoop jar "jar name" package.subpackage.DriverClass [-conf configXML]
inputDir outputDir
Driver类是MainClass。 conf选项是可选的,但建议使用它,并指定一个文件,您可以在其中设置特定的配置选项。
答案 1 :(得分:0)
如果您在Eclipse中作为Java应用程序运行,则Eclipse不会将所有需要的文件(即Mapper
和Reducer
)发送到Hadoop。使用Eclipse插件for Hadoop直接在Eclipse的Hadoop中运行应用程序。