ClassNotFoundException org.apache.mahout.math.VectorWritable

我正在尝试将csv文件转换为序列文件,以便我可以跨数据训练和运行分类器。 我有一个工作java文件,我编译,然后jar到mahout工作jar。 当我在mahout jar中尝试hadoop jar我的工作时,我得到一个java.lang.ClassNotFoundException: org.apache.mahout.math.VectorWritable 。 我不确定为什么这是因为如果我看着mahout jar,那个类确实存在。

以下是我正在做的步骤

 #get new copy of mahout jar rm iris.jar cp /home/stephen/home/libs/mahout-distribution-0.7/core/target/mahout-core-0.7-job.jar iris.jar javac -cp :/home/stephen/home/libs/hadoop-1.0.4/hadoop-core-1.0.4.jar:/home/stephen/home/libs/mahout-distribution-0.7/core/target/mahout-core-0.7-job.jar -d bin/ src/edu/iris/seq/CsvToSequenceFile.java jar ufv iris.jar -C bin . hadoop jar iris.jar edu.iris.seq.CsvToSequenceFile iris-data iris-seq 

这就是我的java文件的样子

 public class CsvToSequenceFile { public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { String inputPath = args[0]; String outputPath = args[1]; Configuration conf = new Configuration(); Job job = new Job(conf); job.setJobName("Csv to SequenceFile"); job.setJarByClass(Mapper.class); job.setMapperClass(Mapper.class); job.setReducerClass(Reducer.class); job.setNumReduceTasks(0); job.setOutputKeyClass(LongWritable.class); job.setOutputValueClass(VectorWritable.class); job.setOutputFormatClass(SequenceFileOutputFormat.class); job.setInputFormatClass(TextInputFormat.class); TextInputFormat.addInputPath(job, new Path(inputPath)); SequenceFileOutputFormat.setOutputPath(job, new Path(outputPath)); // submit and wait for completion job.waitForCompletion(true); } 

}

这是命令行中的错误

 2/10/30 10:43:32 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 12/10/30 10:43:33 INFO input.FileInputFormat: Total input paths to process : 1 12/10/30 10:43:33 INFO util.NativeCodeLoader: Loaded the native-hadoop library 12/10/30 10:43:33 WARN snappy.LoadSnappy: Snappy native library not loaded 12/10/30 10:43:34 INFO mapred.JobClient: Running job: job_201210300947_0005 12/10/30 10:43:35 INFO mapred.JobClient: map 0% reduce 0% 12/10/30 10:43:50 INFO mapred.JobClient: Task Id : attempt_201210300947_0005_m_000000_0, Status : FAILED java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.apache.mahout.math.VectorWritable at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:899) at org.apache.hadoop.mapred.JobConf.getOutputValueClass(JobConf.java:929) at org.apache.hadoop.mapreduce.JobContext.getOutputValueClass(JobContext.java:145) at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getRecordWriter(SequenceFileOutputFormat.java:61) at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.(MapTask.java:628) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:753) 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:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) at org.apache.hadoop.mapred.Child.main(Child.java:249) Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.apache.mahout.math.VectorWritable at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:867) at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:891) ... 11 more 

任何想法如何解决这个或我甚至尝试正确地执行此过程? 我是hadoop和mahout的新手,所以如果我正在做一些艰难的事情,请告诉我。 谢谢!

这是一个非常常见的问题,几乎可以肯定的是,您在hadoop命令中指定类路径的方式存在问题。

hadoop的工作方式,在你给出“hadoop”命令后,它将你的工作交给一个tasktracker来执行。 因此,重要的是要记住你的工作是在一个单独的JVM上执行,它有自己的类路径等。你用“hadoop”命令做的部分工作是指定应该使用的类路径,等等。

如果你使用maven作为构建系统,我强烈建议使用shade插件构建一个“胖jar”。 这将构建一个包含所有必要依赖项的jar,当您向hadoop作业添加依赖项时,您不必担心类路径问题,因为您要运送一个jar。

如果您不想这条路线,请查看本文 ,其中介绍了您的问题和一些可能的解决方案。 特别是,这应该适合你:

hadoop jar …命令的“-libjars”命令行选项中包含JAR。

尝试显式指定类路径,所以代替hadoop jar iris.jar edu.iris.seq.CsvToSequenceFile iris-data iris-seq尝试类似java -cp ...

在创建jar(map / reduce)时,创建具有依赖关系的jar。

随着参考。 对于maven,您可以在pom.xml中添加以下代码并编译代码<< mvn clean package assembly:single >>。 这将在目标文件夹中创建具有依赖性的jar,并且创建的jar可能看起来像<> – 1.0-SNAPSHOT-jar-with-dependencies.jar

    maven-assembly-plugin   jar-with-dependencies    package  single        

希望这能回答你的疑问。