簡體   English   中英

線程“main”中的異常java.lang.NoClassDefFoundError:org / apache / hadoop / hbase / HBaseConfiguration

[英]Exception in thread “main” java.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<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是應該寫入映射器結果的文件夾。

我已經檢查了一些其他鏈接,例如: 引發者: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

HADOOP_USER_CLASSPATH_FIRST=true \
HADOOP_CLASSPATH=$($HBASE_HOME/bin/hbase mapredcp) \
hadoop jar  /home/testdb.jar test 

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM