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) {
...
}
}
Eclipseが作成するプロジェクトからjarをエクスポートしませんでした。プロジェクトフォルダーのディレクトリ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)
何が問題ですか?