#問題描述java
使用hadoop命令執行hbase應用jar包時,報以下錯誤:apache
[hadoop@ breath ~]$ hadoop jar ~/HbaseTest-0.1.jar Test.HtableCreate Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration at Test.HtableCreate.main(HtableCreate.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.hadoop.util.RunJar.run(RunJar.java:221) at org.apache.hadoop.util.RunJar.main(RunJar.java:136) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 7 moreoop
#問題分析spa
查看hadoop的classpath發現並沒有hbase的相關依賴jar包.net
[hadoop@ breath ~]$ hadoop classpath /opt/beh/core/hadoop/etc/hadoop:/opt/beh/core/hadoop/share/hadoop/common/lib/:/opt/beh/core/hadoop/share/hadoop/common/:/opt/beh/core/hadoop/share/hadoop/hdfs:/opt/beh/core/hadoop/share/hadoop/hdfs/lib/:/opt/beh/core/hadoop/share/hadoop/hdfs/:/opt/beh/core/hadoop/share/hadoop/yarn/lib/:/opt/beh/core/hadoop/share/hadoop/yarn/:/opt/beh/core/hadoop/share/hadoop/mapreduce/lib/:/opt/beh/core/hadoop/share/hadoop/mapreduce/:/opt/beh/core/hadoop/contrib/capacity-scheduler/*.jarcode
嘗試在在環境變量CLASSPATH中添加$HBASE_HOME/lib/*無效。hadoop
查看Hbase官方文檔中"HBase and MapReduce"-"HBase, MapReduce, and the CLASSPATH"詳細解釋了MapReduce與Hbase jar執行的關係ci
若是臨時使用環境變量可以下設置:element
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-examples-VERSION.jar
若是永久生效能夠在hadoop-env.sh中設置HADOOP_CLASSPATH,以下設置:文檔
# Extra Java CLASSPATH elements. Automatically insert capacity-scheduler. if [ -z $HBASE_HOME ]; then export HADOOP_CLASSPATH=${HADOOP_CLASSPATH} else export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${HBASE_HOME}/lib'/*' fi