本地编写hbase程序后,maven生成jar包,提交到测试环境,使用MapReduce执行时,
$ yarn jar /home/dwuser/jars/hbase-1.0-SNAPSHOT.jar 类名 参数名....
遇到如下报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/client/Scan
at com.xxx.xxxxxxxx.run(xxxxxx.java:77)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at com.xxx.xxxxx.main(xxxxxx.java:111)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
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.client.Scan
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 9 more
注:报错内容中注释掉了一些敏感信息,用“xxxx”替代了。
报错原因分析:
根据报错返回的日志内容,可以看出,大致是我们在使用MapReduce去执行hhbase程序时,未找到类:org.apache.hadoop.hbase.client.Scan。也就是说,使用MapReduce执行时,不能正确的加载到hbase的jar包。
解决方案:
我们只需要将hbase的jar包引用到hadoop的jar包中即可,亦或者我们执行程序前声明一下hadoop的类路径指向hbase的jar包位置。这里我推荐第二种。
- 首先,我们需要查看下在使用MapReduce执行hbase程序时,需要用到哪些hbase的jar包。可以使用以下命令进行查看:
$HBASE_HOME/bin/hbase mapredcp
- (第一种方案)根据返回的jar包路径,将它们一一复制到hadoop的lib目录下
- (第二种方案)提交hbase程序前,按照如下命令声明一下
export HADOOP_CLASSPATH=`$HBASE_HOME/bin/hbase mapredcp`
不管采取了以上哪两种方式,处理之后,再次提交hbase程序,就不会有报错了。