运行 来自单独驱动程序的 MapReduce 作业 class
Run MapReduce job from separate driver class
我编写了一个小型 MapReduce 作业,它在单个文件中运行良好。我现在需要做的(对于 class)是从单独的 class 驱动相同的 MapReduce 作业。我在下面解释。
什么有效:
public class Count {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
do mapping stuff
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
do reducing stuff
}
public static void main(String[] args) throws Exception {
runs the MR job perfectly!
}
我需要做的事情:
// ===================== NB_train_hadoop.java =====================
public class NB_train_hadoop {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
do mapping stuff
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
do reducing stuff
}
// =========================== run.java ===========================
public class run {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Run NB Count");
// Job job = New Job(conf, "Run NB Count");
job.setJarByClass(NB_train_hadoop.class);
job.setMapperClass(NB_train_hadoop.TokenizerMapper.class);
job.setCombinerClass(NB_train_hadoop.IntSumReducer.class);
job.setReducerClass(NB_train_hadoop.IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
当我 运行 这个时,我在线程 "main" java.lang.NoClassDefFoundError 中得到一个 Exception:NB_train_hadoop$TokenizerMapper
在 run.main(run.java:19) 错误。这指向我的 run.java 中的 setMapperClass 行,但我不明白为什么要得到它。 classes 应该对包中的任何其他 class 可见。
如果有帮助,这就是我编译、jar 和 运行 我的 MR 工作的方式。在第三个命令之前没有错误。
>>> bin/hadoop com.sun.tools.javac.Main NB_train_hadoop.java run.java
>>> jar cvf run.jar run.class
>>> bin/hadoop jar run.jar run /user/nbcount/input /user/nbcount/output3
任何关于为什么会发生这种情况的建议都很棒!
您必须在主程序或驱动程序中指定主程序class或驱动程序class的包信息。
您可以使用以下命令正确执行 Map reduce Job:-
>hadoop jar <Location_of_your_JAR> <package_information_of_the_driver_class> <input_directory> <output_directory>
例如:例如:-
hadoop jar /user/desktop/wordcount.jar com.example.wordcount_driver /user/cloudera/Dataset/input.txt /user/cloudera/output
如果解决方案有效,请接受!
我编写了一个小型 MapReduce 作业,它在单个文件中运行良好。我现在需要做的(对于 class)是从单独的 class 驱动相同的 MapReduce 作业。我在下面解释。
什么有效:
public class Count {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
do mapping stuff
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
do reducing stuff
}
public static void main(String[] args) throws Exception {
runs the MR job perfectly!
}
我需要做的事情:
// ===================== NB_train_hadoop.java =====================
public class NB_train_hadoop {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
do mapping stuff
}
public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
do reducing stuff
}
// =========================== run.java ===========================
public class run {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Run NB Count");
// Job job = New Job(conf, "Run NB Count");
job.setJarByClass(NB_train_hadoop.class);
job.setMapperClass(NB_train_hadoop.TokenizerMapper.class);
job.setCombinerClass(NB_train_hadoop.IntSumReducer.class);
job.setReducerClass(NB_train_hadoop.IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
当我 运行 这个时,我在线程 "main" java.lang.NoClassDefFoundError 中得到一个 Exception:NB_train_hadoop$TokenizerMapper 在 run.main(run.java:19) 错误。这指向我的 run.java 中的 setMapperClass 行,但我不明白为什么要得到它。 classes 应该对包中的任何其他 class 可见。
如果有帮助,这就是我编译、jar 和 运行 我的 MR 工作的方式。在第三个命令之前没有错误。
>>> bin/hadoop com.sun.tools.javac.Main NB_train_hadoop.java run.java
>>> jar cvf run.jar run.class
>>> bin/hadoop jar run.jar run /user/nbcount/input /user/nbcount/output3
任何关于为什么会发生这种情况的建议都很棒!
您必须在主程序或驱动程序中指定主程序class或驱动程序class的包信息。 您可以使用以下命令正确执行 Map reduce Job:-
>hadoop jar <Location_of_your_JAR> <package_information_of_the_driver_class> <input_directory> <output_directory>
例如:例如:- hadoop jar /user/desktop/wordcount.jar com.example.wordcount_driver /user/cloudera/Dataset/input.txt /user/cloudera/output
如果解决方案有效,请接受!