当前位置: 首页 > 面试题库 >

我如何构建/运行这个简单的Mahout程序而不会出现异常?

朱季
2023-03-14
问题内容

我想运行在Mahout In Action中找到的以下代码:

package org.help;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.mahout.math.DenseVector;
import org.apache.mahout.math.NamedVector;
import org.apache.mahout.math.VectorWritable;

public class SeqPrep {

    public static void main(String args[]) throws IOException{

        List<NamedVector> apples = new ArrayList<NamedVector>();

        NamedVector apple;

        apple = new NamedVector(new DenseVector(new double[]{0.11, 510, 1}), "small round green apple");

        apples.add(apple);

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        Path path = new Path("appledata/apples");

        SequenceFile.Writer writer = new SequenceFile.Writer(fs,  conf, path, Text.class, VectorWritable.class);

        VectorWritable vec = new VectorWritable();
        for(NamedVector vector : apples){
            vec.set(vector);
            writer.append(new Text(vector.getName()), vec);
        }
        writer.close();

        SequenceFile.Reader reader = new SequenceFile.Reader(fs, new Path("appledata/apples"), conf);

        Text key = new Text();
        VectorWritable value = new VectorWritable();
        while(reader.next(key, value)){
            System.out.println(key.toString() + " , " + value.get().asFormatString());
        }
        reader.close();

    }

}

我用它编译:

$ javac -classpath :/usr/local/hadoop-1.0.3/hadoop-core-1.0.3.jar:/home/hduser/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT.jar:/home/hduser/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT-job.jar:/home/hduser/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT-sources.jar -d myjavac/ SeqPrep.java

我把它装满了:

$ jar -cvf SeqPrep.jar -C myjavac/ .

现在,我想在我的本地hadoop节点上运行它。我试过了:

 hadoop jar SeqPrep.jar org.help.SeqPrep

但是我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/mahout/math/Vector
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

所以我尝试使用libjars参数

$ hadoop jar SeqPrep.jar org.help.SeqPrep -libjars /home/hduser/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT.jar -libjars /home/hduser/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT-job.jar -libjars /home/hduser/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT-sources.jar -libjars /home/hduser/mahout/trunk/math/target/mahout-math-0.8-SNAPSHOT.jar -libjars /home/hduser/mahout/trunk/math/target/mahout-math-0.8-SNAPSHOT-sources.jar

并遇到了同样的问题。我不知道还能尝试什么。

我最终的目标是能够将hadoop fs上的.csv文件读取为稀疏矩阵,然后将其乘以随机向量。

编辑: 看起来Razvan知道了(请注意:请参见下文,这不会干扰您的hadoop安装)。以供参考:

$ find /usr/local/hadoop-1.0.3/. |grep mah
/usr/local/hadoop-1.0.3/./lib/mahout-core-0.8-SNAPSHOT-tests.jar
/usr/local/hadoop-1.0.3/./lib/mahout-core-0.8-SNAPSHOT.jar
/usr/local/hadoop-1.0.3/./lib/mahout-core-0.8-SNAPSHOT-job.jar
/usr/local/hadoop-1.0.3/./lib/mahout-core-0.8-SNAPSHOT-sources.jar
/usr/local/hadoop-1.0.3/./lib/mahout-math-0.8-SNAPSHOT-sources.jar
/usr/local/hadoop-1.0.3/./lib/mahout-math-0.8-SNAPSHOT-tests.jar
/usr/local/hadoop-1.0.3/./lib/mahout-math-0.8-SNAPSHOT.jar

然后:

$hadoop jar SeqPrep.jar org.help.SeqPrep

small round green apple , small round green apple:{0:0.11,1:510.0,2:1.0}

编辑: 我正在尝试执行此操作,而不将mahout罐复制到hadoop lib /

$ rm /usr/local/hadoop-1.0.3/lib/mahout-*

然后当然:

hadoop jar SeqPrep.jar org.help.SeqPrep

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/mahout/math/Vector
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:149)
Caused by: java.lang.ClassNotFoundException: org.apache.mahout.math.Vector
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

当我尝试mahout作业文件时:

$hadoop jar ~/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT-job.jar org.help.SeqPrep

Exception in thread "main" java.lang.ClassNotFoundException: org.help.SeqPrep
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

如果我尝试包含.jar文件,则会执行以下操作:

$ hadoop jar ~/mahout/trunk/core/target/mahout-core-0.8-SNAPSHOT-job.jar SeqPrep.jar org.help.SeqPrep

Exception in thread "main" java.lang.ClassNotFoundException: SeqPrep.jar

编辑: 显然我一次只能发送一个罐子给hadoop。这意味着我需要将我制作的类添加到mahout核心作业文件中:

~/mahout/trunk/core/target$ cp mahout-core-0.8-SNAPSHOT-job.jar mahout-core-0.8-SNAPSHOT-job.jar_backup

~/mahout/trunk/core/target$ cp ~/workspace/seqprep/bin/org/help/SeqPrep.class .

~/mahout/trunk/core/target$ jar uf mahout-core-0.8-SNAPSHOT-job.jar SeqPrep.class

然后:

~/mahout/trunk/core/target$ hadoop jar mahout-core-0.8-SNAPSHOT-job.jar org.help.SeqPrep

Exception in thread "main" java.lang.ClassNotFoundException: org.help.SeqPrep

编辑: 好的,现在我可以做到而不会弄乱我的hadoop安装了。我在先前的编辑中更新了.jar错误。它应该是:

~/mahout/trunk/core/target$ jar uf mahout-core-0.8-SNAPSHOT-job.jar org/help/SeqPrep.class

然后:

~/mahout/trunk/core/target$ hadoop jar mahout-core-0.8-SNAPSHOT-job.jar org.help.SeqPrep

small round green apple , small round green apple:{0:0.11,1:510.0,2:1.0}

问题答案:

您需要使用Mahout提供的“作业” JAR文件。它打包了所有依赖项。您还需要向其中添加类。这就是Mahout所有示例的工作方式。您不应该将Mahout
jars放置在Hadoop库中,因为这种“安装”程序在Hadoop中太深了。



 类似资料:
  • 我正在尝试执行简单的hibernate java程序- 使用的文件:hibernate。cfg。xml,员工。cfg。Java类:HibernateUtil。爪哇,员工们。爪哇,性别。java(Enum),InsertIntoEmployee。JAVA InsertIntoEmployee的代码。JAVA 获取以下错误: Classpath条目如下: 在过去的三天里,我一直在讨论这个问题。 谷歌搜

  • 我正在尝试用Java制作一个与OpenGL(使用LWJGL 2)的窗口。当我尝试运行时,Eclipse BuiltInclassLoader出现了ClassNotFoundException错误。 我期望输出显示一个窗口,这是真正的输出: 线程“main”java.lang.noClassDeffounder中的异常错误:org/lwjgl/lwjglexception在enginetester.

  • 我有一份来自starter Maven项目的Flink工作。该作业有一个打开Postgres JDBC连接的源。我正在我自己的Flink会话集群上使用示例。 当我第一次提交作业时,它会成功执行。当我尝试再次提交时,我得到以下错误: 我必须重新启动我的集群,以便重新运行我的工作。为什么会发生这种情况?如何在不重新启动群集的情况下再次提交作业? Maven入门项目的唯一补充是: Flink源代码只打开

  • 我在运行wordcount程序时出错。 我试过python shell 在org.apache.xbean.asm6.classreader.(classreader.java:136) 在org.apache.xbean.asm6.classreader.(classreader.java:237) 在org.apache.spark.util.ClosureCleaner$.GetClassR

  • 我在android studio虚拟设备nexus 6中卸载了kotlin制作的应用程序,当我再次尝试构建gradle时,它显示了这个错误。帮我修一下。 e:C:/Users/acer/。gradle/caches/transforms-2/files-2.1/3f5d451ee838e9d174f4df0a62e3601f/jetified-core-ktx-1.7.0-api。罐子/META-

  • 问题内容: 正如您可能从问题本身可以理解的那样,我是Java的新手。我进行了一个练习,编写一个Java程序,该程序接收一个字符,将其打印并输出Unicode表中的下一个字符。 现在,我有解决此问题的方法: 我了解此代码的基本概念,但是我试图在Eclipse中运行此代码,但遇到一个令人讨厌的错误: 线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:M