我一直尝试在hadoop中使用pagerank算法,但在初始化作业时遇到了一些问题。
当我尝试使用作业类进行初始化时,在编译时出现以下错误:
线程“main”java.lang.noclassdeffounderror中出现异常:org/apache/commons/logging/logfactory,位于org.apache.hadoop.mapreduce.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不能应用于给定类型;
必需:类?扩展Map器
找到:类prmap
原因:实际参数类prmap无法转换为类?通过方法调用转换扩展Map器
似乎我无法将prmap.class作为参数传递给setmapperclass,即使我编写的prmap类遵循hadoop的map函数标准
public static class PRMap extends Mapper<LongWritable, Text, Text, Text>
{ ... }
对这两种方法有什么建议吗?
4条答案
按热度按时间0ve6wy6x1#
看起来prmap类扩展了org.apache.hadoop.mapreduce.mapperhttp://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。
qgelzfjb2#
这是因为Map器无法找到
LogFactory
,这是common-loggings.jar
. 为此,您必须使每个客户机Map程序都可以访问它,方法是将jar复制到所有计算机上,或者通过其他有效的方法将jar复制到分布式缓存中。更多信息可以在这里找到
0aydgbwb3#
尝试将包含org.apache.commons.logging.logfactory jar的jar放到每台机器的hadoophome的lib目录中,然后重新启动集群。
或者可以尝试使用libjars选项通过命令行添加jar。作为:
hadoop jar myjar.jar包.classname-libjars mypath/common-loggings.jar
kpbwa7wx4#
在main方法中添加这一行。