[HADOOP] thread "main"의 예외 java.lang.NoClassDefFoundError : org / apache / hadoop / hbase / HBaseConfiguration
HADOOPthread "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.문제가 해결되었지만 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.hadoop-env.sh 파일을 편집하려고했지만 여기에 언급 된 변경 사항은 저에게 효과적이지 않습니다.
hadoop-env.sh 파일을 편집하려고했지만 여기에 언급 된 변경 사항은 저에게 효과적이지 않습니다.
이것이 성공한 이유는 다음과 같습니다.
export HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$HBASE_HOME/lib/*"
방금 hadoop-env.sh의 끝에 추가했습니다. HBASE_HOME 변수를 설정하는 것을 잊지 마십시오. $ HBASE_HOME을 hbase 설치의 실제 경로로 바꿀 수도 있습니다.
-
==============================
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.여기 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.
HADOOP_USER_CLASSPATH_FIRST=true \ HADOOP_CLASSPATH=$($HBASE_HOME/bin/hbase mapredcp) \ hadoop jar /home/testdb.jar test
from https://stackoverflow.com/questions/26364057/exception-in-thread-main-java-lang-noclassdeffounderror-org-apache-hadoop-hba by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop은 YARN 애플리케이션의 로그를 어디에 저장합니까? (0) | 2019.06.02 |
---|---|
[HADOOP] 원인 : ERROR XSDB6 : Derby의 다른 인스턴스가 이미 데이터베이스를 부팅했을 수 있습니다. (0) | 2019.06.02 |
[HADOOP] HiveQL (Hadoop)을 사용하여 Hive에서 두 개의 테이블 조인 [duplicate] (0) | 2019.06.01 |
[HADOOP] 네임 노드 파일 수량 제한 (0) | 2019.06.01 |
[HADOOP] 작은 파일 및 HDFS 블록 (0) | 2019.06.01 |