Ausnahme im Thread "main" java.lang.NoClassDefFoundError: org / apache / hadoop / hbase / HBaseConfiguration

Ich verwende Hadoop 1.0.3 und HBase 0.94.22. Ich versuche, ein Mapper-Programm auszuführen, um Werte aus einer Hbase-Tabelle zu lesen und in eine Datei auszugeben. Ich erhalte den folgenden Fehler:

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)

Der Code ist wie folgt

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);

    }

}

Ich lasse den obigen Code in eine JAR-Datei exportieren und verwende in der Befehlszeile den folgenden Befehl, um den obigen Code auszuführen.

hadoop jar /home/testdb.jar test

where test ist der Ordner, in den die Mapper-Ergebnisse geschrieben werden sollen.

Ich habe ein paar andere Links wie @ überprüUrsache: java.lang.ClassNotFoundException: org.apache.zookeeper.KeeperException wo vorgeschlagen wurde, die Zookeeper-Datei in den Klassenpfad aufzunehmen, aber beim Erstellen des Projekts in Eclipse habe ich bereits die Zookeeper-Datei aus dem lib-Verzeichnis von hbase aufgenommen. Die Datei, die ich eingefügt habe, ist zookeeper-3.4.5.jar. Ans besuchte auch diesen Link zuHBase - java.lang.NoClassDefFoundError in java, aber ich benutze eine Mapper-Klasse, um die Werte aus der hbase-Tabelle zu erhalten, keine Client-API. Ich weiß, dass ich irgendwo einen Fehler mache. Könntet ihr mir bitte helfe

Ich habe eine andere seltsame Sache bemerkt, als ich den gesamten Code in der Hauptfunktion mit Ausnahme der ersten Zeile "HBaseConfiguration conf = new HBaseConfiguration ();" entferne, dann den Code in eine JAR-Datei exportiere und versuche, die JAR-Datei als zu kompilieren hadoop jar test.jar ich bekomme immer noch den gleichen fehler. Entweder definiere ich die conf-Variable falsch oder es gibt ein Problem mit meiner Umgebung.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage