복붙노트

[HADOOP] thread "main"의 예외 java.lang.NoClassDefFoundError : org / apache / hadoop / hbase / HBaseConfiguration

HADOOP

thread "main"의 예외 java.lang.NoClassDefFoundError : org / apache / hadoop / hbase / HBaseConfiguration

Hadoop 1.0.3과 HBase 0.94.22를 사용하고 있습니다. mapper 프로그램을 실행하여 Hbase 테이블에서 값을 읽고 파일로 출력하려고합니다. 다음과 같은 오류가 발생합니다.

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:340)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:149)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

코드는 다음과 같습니다.

import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


    public class Test {

    static class TestMapper extends TableMapper<Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);

        public void map(ImmutableBytesWritable row, Result value, Context context) throws    IOException, InterruptedException
        {
            ImmutableBytesWritable userkey = new ImmutableBytesWritable(row.get(), 0 , Bytes.SIZEOF_INT);
            String key =Bytes.toString(userkey.get());
            context.write(new Text(key), one);

        }
    }


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

        HBaseConfiguration conf = new HBaseConfiguration();
        Job job = new Job(conf, "hbase_freqcounter");
        job.setJarByClass(Test.class);
        Scan scan = new Scan();

        FileOutputFormat.setOutputPath(job, new Path(args[0]));
        String columns = "data";
        scan.addFamily(Bytes.toBytes(columns));
        scan.setFilter(new FirstKeyOnlyFilter());
        TableMapReduceUtil.initTableMapperJob("test",scan, TestMapper.class, Text.class, IntWritable.class, job);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        System.exit(job.waitForCompletion(true)?0:1);

    }

}

위의 코드를 jar 파일로 내보내고 위의 코드를 실행하기 위해 명령 줄에서 아래 명령을 사용합니다.

hadoop jar /home/testdb.jar 테스트

여기서 test는 매퍼 결과를 기록해야하는 폴더입니다.

나는 다음과 같은 몇 가지 다른 링크를 확인했다 : java.lang.ClassNotFoundException : org.apache.zookeeper.KeeperException 클래스 패스에 동물원 파일을 포함 시키도록 제안되었지만 Eclipse에서 프로젝트를 생성하는 동안 이미 동물원을 포함시켰다. hbase의 lib 디렉토리에있는 파일. 포함 된 파일은 zookeeper-3.4.5.jar입니다. Ans는 또한이 링크도 자바에서 java.ase - java.lang.NoClassDefFoundError를 방문했지만 mapper 클래스를 사용하여 클라이언트 API가 아닌 hbase 테이블에서 값을 가져 왔습니다. 나는 어딘가에서 실수를 저지르고 있다는 것을 알고있다, 너희들은 나를 도울 수 있니?

나는 "HBaseConfiguration conf = new HBaseConfiguration ();"을 제외하고 main 함수에서 모든 코드를 제거한 다음 jar 파일로 코드를 내보내고 hadoop으로 jar 파일을 컴파일하려고 시도하는 또 다른 이상한 점을 지적했다. jar test.jar 여전히 같은 오류가 발생합니다. conf 변수를 잘못 정의하고 있거나 내 환경에 문제가있는 것 같습니다.

해결법

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

    1.문제가 해결되었지만 hadoop-env.sh 파일에 hbase 클래스 경로를 추가하지 않았습니다. 아래는 제가 일을하기 위해 추가 한 것입니다.

    문제가 해결되었지만 hadoop-env.sh 파일에 hbase 클래스 경로를 추가하지 않았습니다. 아래는 제가 일을하기 위해 추가 한 것입니다.

    $ export HADOOP_CLASSPATH=$HBASE_HOME/hbase-0.94.22.jar:\
        $HBASE_HOME/hbase-0.94.22-test.jar:\
        $HBASE_HOME/conf:\
        ${HBASE_HOME}/lib/zookeeper-3.4.5.jar:\
        ${HBASE_HOME}/lib/protobuf-java-2.4.0a.jar:\
        ${HBASE_HOME}/lib/guava-11.0.2.jar
    
  2. ==============================

    2.hadoop-env.sh 파일을 편집하려고했지만 여기에 언급 된 변경 사항은 저에게 효과적이지 않습니다.

    hadoop-env.sh 파일을 편집하려고했지만 여기에 언급 된 변경 사항은 저에게 효과적이지 않습니다.

    이것이 성공한 이유는 다음과 같습니다.

    export HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$HBASE_HOME/lib/*"
    

    방금 hadoop-env.sh의 끝에 추가했습니다. HBASE_HOME 변수를 설정하는 것을 잊지 마십시오. $ HBASE_HOME을 hbase 설치의 실제 경로로 바꿀 수도 있습니다.

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

    3.다른 경로 / 구성을 가진 사람이있는 경우. 다음은 그것이 작동하도록하기 위해 hadoop-env.sh에 추가 한 내용입니다.

    다른 경로 / 구성을 가진 사람이있는 경우. 다음은 그것이 작동하도록하기 위해 hadoop-env.sh에 추가 한 내용입니다.

    $ export HADOOP_CLASSPATH="$HBASE_HOME/lib/hbase-client-0.98.11-hadoop2.jar:\
        $HBASE_HOME/lib/hbase-common-0.98.11-hadoop2.jar:\
        $HBASE_HOME/lib/protobuf-java-2.5.0.jar:\
        $HBASE_HOME/lib/guava-12.0.1.jar:\
        $HBASE_HOME/lib/zookeeper-3.4.6.jar:\
        $HBASE_HOME/lib/hbase-protocol-0.98.11-hadoop2.jar"
    

    참고 : $ HBASE_HOME을 설정하지 않은 경우 2 가지 선택 사항이 있습니다.  - 내보내기로 HBASE_HOME = [hbase 설치 경로]  - 아니면 $ HBASE_HOME을 hbase의 전체 경로로 바꾸십시오.

  4. ==============================

    4.여기 CreateTable은 나의 자바 클래스 파일이다.

    여기 CreateTable은 나의 자바 클래스 파일이다.

    이 명령을 사용하십시오.

    java -cp. : / home / hadoop / hbase / hbase-0.94.8 / hbase-0.94.8.jar : /home/hadoop/hbase/hbase-0.94.8/lib/* CreateTable

  5. ==============================

    5.

    HADOOP_USER_CLASSPATH_FIRST=true \
    HADOOP_CLASSPATH=$($HBASE_HOME/bin/hbase mapredcp) \
    hadoop jar  /home/testdb.jar test 
    
  6. from https://stackoverflow.com/questions/26364057/exception-in-thread-main-java-lang-noclassdeffounderror-org-apache-hadoop-hba by cc-by-sa and MIT license