복붙노트

[HADOOP] 예외없이이 간단한 Mahout 프로그램을 빌드 / 실행하려면 어떻게해야합니까?

HADOOP

예외없이이 간단한 Mahout 프로그램을 빌드 / 실행하려면 어떻게해야합니까?

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 :

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

이제 로컬 노드 노드에서 실행하고 싶습니다. 난 노력 했어:

 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

편집 : 분명히 한 번에 한 항아리 만 보낼 수 있습니다. 즉, 내가 만든 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}

해결법

  1. ==============================

    1.Mahout에서 제공하는 "job"JAR 파일을 사용해야합니다. 모든 의존성을 패키지화합니다. 클래스도 추가해야합니다. 이것은 모든 Mahout 예제가 작동하는 방식입니다. Mahout 병을 Hadoop 라이브러리에 넣지 마십시오. Hadoop에 프로그램이 너무 깊게 설치되기 때문입니다.

    Mahout에서 제공하는 "job"JAR 파일을 사용해야합니다. 모든 의존성을 패키지화합니다. 클래스도 추가해야합니다. 이것은 모든 Mahout 예제가 작동하는 방식입니다. Mahout 병을 Hadoop 라이브러리에 넣지 마십시오. Hadoop에 프로그램이 너무 깊게 설치되기 때문입니다.

  2. ==============================

    2.예를 들어 https://github.com/tdunning/MiA 저장소에서 코드를 작성하면 Maven 용 pom.xml 파일을 사용할 수 있습니다. 그리고 mvn 패키지로 코드를 컴파일하면 대상 디렉토리에 mia-0.1-job.jar이 생성됩니다 -이 아카이브는 Hadoop의 것을 제외한 모든 종속성을 포함하므로 Hadoop 클러스터에서 문제없이 실행할 수 있습니다

    예를 들어 https://github.com/tdunning/MiA 저장소에서 코드를 작성하면 Maven 용 pom.xml 파일을 사용할 수 있습니다. 그리고 mvn 패키지로 코드를 컴파일하면 대상 디렉토리에 mia-0.1-job.jar이 생성됩니다 -이 아카이브는 Hadoop의 것을 제외한 모든 종속성을 포함하므로 Hadoop 클러스터에서 문제없이 실행할 수 있습니다

  3. ==============================

    3.

    <dependency>
        <groupId>org.apache.mahout</groupId>
        <artifactId>mahout-math</artifactId>
        <version>0.7</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.mahout</groupId>
        <artifactId>mahout-collections</artifactId>
        <version>1.0</version>
    </dependency>
    
  4. ==============================

    4.내가 한 것은 내 jar와 모든 mahout jar 파일로 HADOOP_CLASSPATH를 설정하는 것입니다. 아래 그림과 같이.

    내가 한 것은 내 jar와 모든 mahout jar 파일로 HADOOP_CLASSPATH를 설정하는 것입니다. 아래 그림과 같이.

    HADOOP_CLASSPATH = / home / xxx / my.jar : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/mahout/mahout-core-0.7-cdh4.3.0.jar을 내 보냅니다. : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/mahout/mahout-core-0.7-cdh4.3.0-job.jar : / opt / cloudera / parcels / CDH -4.3.0-1.cdh4.3.0.p0.22 / lib / mahout / mahout-examples-0.7-cdh4.3.0.jar : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0. p0.22 / lib / mahout / mahout-examples-0.7-cdh4.3.0-job.jar : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/mahout/mahout -integration-0.7-cdh4.3.0.jar : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/mahout/mahout-math-0.7-cdh4.3.0.jar

    그 다음 나는 달릴 수 있었다. hadoop com.mycompany.mahout.CSVtoVector iris / nb / iris1.csv iris / nb / data / iris.seq

    HADOOP_CLASSPATH에 모든 jar와 mahout jar를 포함 시켜야만 클래스를 실행할 수 있습니다. hadoop

  5. from https://stackoverflow.com/questions/11479600/how-do-i-build-run-this-simple-mahout-program-without-getting-exceptions by cc-by-sa and MIT license