Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
Je suis en utilisant Hadoop 1.0.3 et HBase 0.94.22. Je suis en train de lancer un mappeur programme pour lire les valeurs à partir d'une table Hbase et de les exporter dans un fichier. J'obtiens l'erreur suivante:
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)
Le code ci-dessous est
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);
}
}
- Je obtenir le code ci-dessus exportées vers un fichier jar et sur la ligne de commande-je utiliser la commande ci-dessous pour exécuter le code ci-dessus.
hadoop jar /home/testdb.jar test
où test est le dossier dans lequel le mappeur de résultats doit être écrit.
J'ai vérifié un certain nombre d'autres liens comme Causés par: java.lang.ClassNotFoundException: org.apache.zookeeper.KeeperException où il a été suggéré d'inclure le zookeeper fichier dans le classpath, mais lors de la création du projet dans eclipse, j'ai déjà inclus zookeeper fichier à partir du répertoire lib de hbase. Le fichier que j'ai compris est zookeeper-3.4.5.jar. Sna également visité ce lien trop HBase - java.lang.NoClassDefFoundError en java , mais je suis en utilisant un mappeur de classe pour obtenir les valeurs de la table hbase pas n'importe quel client de l'API. Je sais que je fais une erreur quelque part, les gars, pourriez-vous svp m'aider ??
J'ai remarqué une autre chose étrange, quand j'ai supprimer tout le code dans la fonction principale exception de la première ligne " HBaseConfiguration conf = new HBaseConfiguration();", puis exporter le code dans un fichier jar et essayez de compiler le fichier jar hadoop jar test.jar j'obtiens toujours la même erreur. Il semble que ce soit je suis la définition de la conf variable de manière incorrecte ou il y a un problème avec mon environnement.
OriginalL'auteur Abhisekh | 2014-10-14
Vous devez vous connecter pour publier un commentaire.
J'ai eu le correctif pour le problème, je n'avais pas ajouté la hbase dans le classpath hadoop-env.sh fichier. Ci-dessous est celui que j'ai ajouté pour rendre le poste de travail.
OriginalL'auteur Abhisekh
J'ai essayé de l'édition de la
hadoop-env.sh
fichier, mais les changements mentionnés ici ne fonctionne pas pour moi.Ce qui a fonctionné, c'est ceci:
J'ai juste ajouté qu'à la fin de mon
hadoop-env.sh
.Ne pas oublier de mettre votre
HBASE_HOME
variable.Vous pouvez également remplacer le
$HBASE_HOME
avec le chemin d'accès réel de votre hbase installation.OriginalL'auteur Vaclav C.
Dans le cas où il y a quelqu'un qui a des chemins différents/configuration. Voici ce que j'ai ajouté à
hadoop-env.sh
afin de la faire fonctionner:REMARQUE: si vous n'avez pas réglé le
$HBASE_HOME
vous avez 2 choix.- Par
export HBASE_HOME=[your hbase installation path]
- Ou tout simplement remplacer la
$HBASE_HOME
avec votre hbase chemin d'accès completOriginalL'auteur Spacez
ici CreateTable est mon fichier de classe java
utilisez cette commande
java -cp .:/home/hadoop/hbase/hbase-0.94.8/hbase-0.94.8.jar:/home/hadoop/hbase/hbase-0.94.8/lib/* CreateTable
OriginalL'auteur y durga prasad
OriginalL'auteur Junyong