classnotfoundexception org.apache.mahout.math.vectorwritable

hujrc8aj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(383)

我试图把一个csv文件转换成序列文件,这样我就可以在数据中训练和运行一个分类器。我有一个jobjava文件,我编译了它,然后把它放入mahout jobjar中。当我试着 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.<init>(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的新手,所以如果我做了一些困难的事情,请告诉我。谢谢!

kr98yfug

kr98yfug1#

尝试显式指定类路径,因此 hadoop jar iris.jar edu.iris.seq.CsvToSequenceFile iris-data iris-seq 试试这样的 java -cp ...

qvtsj1bj

qvtsj1bj2#

在创建jar(map/reduce)时,使用依赖项创建jar。
参考maven,您可以在pom.xml中添加以下代码并编译代码assembly:single >> . 这将在目标文件夹中创建带有dependencies的jar,创建的jar可能看起来像<>-1.0-snapshot-jar-with-dependencies.jar

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</configuration>
</plugin>
</plugins>
</build>

希望这能回答你的疑问。

mftmpeh8

mftmpeh83#

这是一个非常常见的问题,几乎可以肯定的是,在hadoop命令中指定类路径的方式存在问题。
按照hadoop的工作方式,在您发出“hadoop”命令之后,它会将您的作业发送给tasktracker执行。因此,一定要记住,你的作业是在一个单独的jvm上执行的,它有自己的类路径,等等。使用hadoop命令的一部分是指定应该使用的类路径,等等。
如果您使用maven作为构建系统,我强烈建议您使用shade插件构建一个“胖jar”。这将构建一个包含所有必需依赖项的jar,当您将依赖项添加到hadoop作业中时,您不必担心类路径问题,因为您只提供一个jar。
如果你不想走这条路,看看这篇文章,它描述了你的问题和一些潜在的解决方案。特别是,这对您来说应该很有用:
在的“-libjars”命令行选项中包含jar hadoop jar … 命令。

相关问题