线程“main”中的exceptionjava.lang.NoClassDefFoundError:org / apache / hadoop / hbase / HBaseConfiguration
我使用的是Hadoop 1.0.3和HBase 0.94.22。 我试图运行一个映射器程序来读取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 { 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 ,其中建议在类路径中包含zookeeper文件,但是在eclipse中创建项目时我已经包含了zookeeper来自hbase的lib目录的文件。 我包含的文件是zookeeper-3.4.5.jar。 Ans也在java中访问了这个链接HBase – java.lang.NoClassDefFoundError ,但是我使用mapper类来获取hbase表中的值而不是任何客户端API。 我知道我在某个地方犯了错误,伙计们能帮帮我吗?
我注意到另一个奇怪的事情,当我删除main函数中的所有代码,除了第一行“HBaseConfiguration conf = new HBaseConfiguration();”,然后将代码导出到jar文件并尝试将jar文件编译为hadoop jar test.jar我仍然得到同样的错误。 似乎要么我错误地定义了conf变量,要么我的环境存在一些问题。
我得到了解决问题的方法,我没有在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
我尝试编辑hadoop-env.sh
文件,但这里提到的更改对我不起作用。
有用的是:
export HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$HBASE_HOME/lib/*"
我刚刚在hadoop-env.sh
的末尾添加了它。 不要忘记设置HBASE_HOME
变量。 您还可以将$HBASE_HOME
替换$HBASE_HOME
安装的实际路径。
如果有人有不同的路径/配置。 以下是我添加到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个选择。 – 通过export HBASE_HOME=[your hbase installation path]
– 或者用你的hbase完整路径替换$HBASE_HOME
这里的CreateTable是我的java类文件
使用此命令
java -cp .:/home/hadoop/hbase/hbase-0.94.8/hbase-0.94.8.jar:/home/hadoop/hbase/hbase-0.94.8/lib/* CreateTable
HADOOP_USER_CLASSPATH_FIRST=true \ HADOOP_CLASSPATH=$($HBASE_HOME/bin/hbase mapredcp) \ hadoop jar /home/testdb.jar test
- 使用Java连接到远程HBase服务
- 如何在Hadoop-.20 api中指定KeyValueTextInputFormat分隔符?
- 在值上迭代两次(MapReduce)
- 使用hadoop和java命令执行map-reduce作业之间有什么区别
- 无法找到或加载主类com.sun.tools.javac.Main hadoop mapreduce
- Hive NVL不适用于列的日期类型 – NullpointerException
- 如何告诉MapReduce使用多少映射器?
- Hadoop:没有可写接口的简单方法将对象作为输出值
- 错误的值类:类org.apache.hadoop.io.Text不是类org.apache.hadoop.io.IntWritable