我一直在尝试使用带有hadoop的pagerank算法,我在初始化作业时遇到了一些问题。
当我尝试使用Job类进行初始化时,我在编译时遇到以下错误:
线程“main”中的异常java.lang.NoClassDefFoundError:org / apache / commons / logging / LogFactory 在org.apache.hadoop.mapreduce.Job。(Job.java:89) 在Pagerank.main(Pagerank.java:244)
以下是代码:
Job job;
job = new Job();
job.setJarByClass(Pagerank.class); // In what class are our map/reduce functions for this job found?
job.setMapperClass(PRMap.class); // What is our map function for this job?
job.setReducerClass(PRReduce.class); // What is our reduce function for this job?
job.setOutputKeyClass(Text.class); // What are the (hadoop.io compliant) datatype for our
job.setOutputValueClass(Text.class); // reducer output's key-value pairs?
job.setInputFormatClass(TextInputFormat.class); // How will the mapper distinguish (key value) record inputs?
FileInputFormat.addInputPath(job, new Path(args[0])); // First command line argument
FileOutputFormat.setOutputPath(job, new Path("temp0"));
job.waitForCompletion(true);
当我尝试使用JobConf类进行初始化时,我得到一些关于所使用的某些方法的争论的错误。
以下是代码:
JobConf conf = new JobConf(Pagerank.class);
conf.setJobName("pagerank");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);
conf.setMapperClass(PRMap.class);
conf.setReducerClass(PRReduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
根据错误:
类JobConf中的方法setMapperClass不能应用于给定类型;
必需:Class?扩展Mapper
发现:PRMap类
原因:实际参数类PRMap无法转换为Class?通过方法调用转换扩展Mapper
似乎我无法将PRMap.class作为arMap在setMapperClass中传递,即使我编写的PRMap类遵循Hadoop的Map函数标准
public static class PRMap extends Mapper<LongWritable, Text, Text, Text>
{ ... }
对这两种方法有何建议?
答案 0 :(得分:1)
尝试将包含org.apache.commons.Logging.LogFactory jar的jar放入每台机器的HadoopHome的Lib目录中,然后重新启动集群。
或者您可以尝试使用libjars选项通过命令行添加jar。 as:
hadoop jar myjar.jar package.classname -libjars mypath / common-loggings.jar
答案 1 :(得分:1)
在您的主要方法中添加此行。
DistributedCache.addFileToClassPath(new Path("<Absolute Path>/common-loggings.jar"), conf);
答案 2 :(得分:0)
看起来PRMap类扩展了org.apache.hadoop.mapreduce.Mapper http://hadoop.apache.org/docs/mapreduce/current/api/org/apache/hadoop/mapreduce/Mapper.html,并且需要通过JobConf传递的类应该是org.apache.hadoop.mapred.Mapper的子类。
要解决java.lang.NoClassDefFoundError的问题,请将commons-logging-x.x.x.jar添加到类路径中。
运行hadoop classpath以确认您是否看到jar出现。
答案 3 :(得分:0)
这是因为Mapper无法找到LogFactory
,这是common-loggings.jar
的一部分。为此,您必须使每个客户端映射器都可以访问它,通过将jar复制到所有计算机或其他有效方式是复制到分布式缓存中。
$bin/hadoop fs -copyFromLocal mylib.jar /myapp/mylib.jar
And accessing it from you code
DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job);
可以找到更多here