복붙노트

[HADOOP] ClassNotFoundException org.apache.mahout.math.VectorWritable

HADOOP

ClassNotFoundException org.apache.mahout.math.VectorWritable

시퀀스 파일로 csv 파일을 변환하여 데이터에서 분류자를 실행하고 실행할 수 있도록 노력하고 있습니다. 내가 컴파일 한 mahout 작업 항아리에 jar 파일을 가지고 있습니다. 그리고 mahout jar에서 내 일을 hadoop하려고 할 때 java.lang.ClassNotFoundException : org.apache.mahout.math.VectorWritable이 발생합니다. 나는 왜 이것이 마호 항아리를 보면 그 계급이 실제로 존재하기 때문에 이것이 왜 존재하는지 모르겠습니다.

여기 내가하는 조치들이있다.

#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

그리고 이것은 내 자바 파일이 어떻게 생겼는지이다.

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에 새로운데, 만약 내가 어려운 일을한다면, 알려줘. 감사!

해결법

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

    1.이는 매우 일반적인 문제이며 hadoop 명령에서 클래스 경로를 지정하는 방식과 관련하여 거의 확실한 문제입니다.

    이는 매우 일반적인 문제이며 hadoop 명령에서 클래스 경로를 지정하는 방식과 관련하여 거의 확실한 문제입니다.

    hadoop이 작동하는 방식은 "hadoop"명령을 내린 후 작업 추적자에게 작업을 전달하여 실행되도록합니다. 따라서 작업이 별도의 JVM, 자체 클래스 경로 등에서 실행되고 있다는 점을 명심해야합니다. "hadoop"명령으로 수행중인 작업의 일부는 사용해야하는 클래스 경로를 지정하는 것입니다.

    빌드 시스템으로 maven을 사용한다면 shade plugin을 사용하여 "fat jar"를 빌드 할 것을 강력히 권장합니다. 이렇게하면 필요한 모든 의존성을 포함하는 jar 파일을 빌드 할 수 있습니다. 하나의 jar 파일을 제공하기 때문에 hadoop 작업에 종속성을 추가 할 때 classpath 문제에 대해 걱정할 필요가 없습니다.

    이 길을 가고 싶지 않다면 문제와 몇 가지 잠재적 인 해결책을 설명하는이 기사를 살펴보십시오. 특히, 이것은 당신을 위해 작동해야합니다 :

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

    2.hadoop jar 대신 iris.jar edu.iris.seq.CsvToSequenceFile 아이리스 - 데이터 아이리스 - seq java -cp와 같은 것을 시도해보십시오.

    hadoop jar 대신 iris.jar edu.iris.seq.CsvToSequenceFile 아이리스 - 데이터 아이리스 - seq java -cp와 같은 것을 시도해보십시오.

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

    3.항아리 (map / reduce)를 만들 때 의존성이있는 항아리를 만듭니다.

    항아리 (map / reduce)를 만들 때 의존성이있는 항아리를 만듭니다.

    심판과 함께. maven에 다음 코드를 pom.xml에 추가하고 << mvn 클린 패키지 어셈블리 : 단일 >> 코드를 컴파일 할 수 있습니다. 이렇게하면 대상 폴더에 depencendcies가있는 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>
    

    바라기를 이것은 당신의 의심에 응답합니다.

  4. from https://stackoverflow.com/questions/13139774/classnotfoundexception-org-apache-mahout-math-vectorwritable by cc-by-sa and MIT license