【问题标题】:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/hadoop/hbase/HBaseConfiguration
【发布时间】:2014-10-14 15:01:10
【问题描述】:

我正在使用 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<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 获取值。我知道我在某个地方犯了一个错误,你们能帮帮我吗??

我注意到另一个奇怪的事情,当我删除除第一行“HBaseConfiguration conf = new HBaseConfiguration();”之外的所有主函数中的代码时,然后将代码导出到jar文件并尝试编译jar文件作为 hadoop jar test.jar 我仍然得到同样的错误。看来我定义的 conf 变量不正确,或者我的环境有问题。

【问题讨论】:

    标签: java hadoop hbase


    【解决方案1】:

    我已经解决了这个问题,我没有在 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 文件,但此处提到的更改对我不起作用。

      这是有效的:

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

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

      【讨论】:

        【解决方案3】:

        如果有人有不同的路径/配置。这是我添加到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,您有两个选择。 - 通过export HBASE_HOME=[your hbase installation path] - 或者只是用你的 hbase 完整路径替换 $HBASE_HOME

        【讨论】:

          【解决方案4】:
          HADOOP_USER_CLASSPATH_FIRST=true \
          HADOOP_CLASSPATH=$($HBASE_HOME/bin/hbase mapredcp) \
          hadoop jar  /home/testdb.jar test 
          

          【讨论】:

            【解决方案5】:

            这里的 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

            【讨论】:

              猜你喜欢
              • 2017-02-15
              • 2013-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多