首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >主线程java.lang.NoClassDefFoundError异常: org/apache/hadoop/hbase/HBaseConfiguration

主线程java.lang.NoClassDefFoundError异常: org/apache/hadoop/hbase/HBaseConfiguration
EN

Stack Overflow用户
提问于 2014-10-14 23:01:11
回答 4查看 39.3K关注 0票数 5

我使用的是Hadoop1.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<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是映射器结果应写入的文件夹。

我已经检查了其他一些链接,比如Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.KeeperException,其中建议在类路径中包含zookeeper文件,但在eclipse中创建项目时,我已经从hbase的lib目录中包含了zookeeper文件。我包含的文件是zookeeper-3.4.5.jar。Ans也访问了这个链接HBase - java.lang.NoClassDefFoundError in java,但我使用一个映射器类从hbase表中获取值,而不是任何客户端API。我知道我在哪里弄错了,你们能帮帮我吗??

我注意到另一件奇怪的事情,当我删除主函数中除第一行“hadoop = new HBaseConfiguration();”之外的所有代码,然后将代码导出到jar文件并尝试将jar文件编译为HBaseConfiguration jar test.jar时,我仍然得到相同的错误。似乎要么是我错误地定义了conf变量,要么是我的环境有问题。

EN

回答 4

Stack Overflow用户

发布于 2014-10-15 23:09:57

我得到了问题的修复,我没有在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
票数 7
EN

Stack Overflow用户

发布于 2016-04-23 04:10:58

我尝试编辑hadoop-env.sh文件,但这里提到的更改对我无效。

起作用的是:

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

我只是在我的hadoop-env.sh末尾添加了这一点。不要忘记设置您的HBASE_HOME变量。您还可以将$HBASE_HOME替换为您的hbase安装的实际路径。

票数 5
EN

Stack Overflow用户

发布于 2015-12-07 14:17:40

HADOOP_USER_CLASSPATH_FIRST=true \
HADOOP_CLASSPATH=$($HBASE_HOME/bin/hbase mapredcp) \
hadoop jar  /home/testdb.jar test 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26364057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档