2014-10-14 4 views
2

Я использую Hadoop 1.0.3 и HBase 0.94.22. Я пытаюсь запустить программу mapper для чтения значений из таблицы Hbase и вывода их в файл. Я получаю следующее сообщение об ошибке:Исключение в теме "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration

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

    } 

} 

Я получаю код выше экспортирован в файл банки и в командной строке я использую следующую команду для запуска выше код.

Hadoop баночка тест /home/testdb.jar

где тест является папка, в которой результаты картографа должны быть написаны.

Я проверил несколько других ссылок, таких как Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.KeeperException, где было предложено включить файл zookeeper в путь к классам, но при создании проекта в eclipse я уже включил файл zookeeper из каталога lib hbase. Файл, который я включил, - zookeeper-3.4.5.jar. Ans также посетил эту ссылку тоже HBase - java.lang.NoClassDefFoundError in java, но я использую класс mapper, чтобы получить значения из таблицы hbase, а не API-интерфейс клиента. Я знаю, что я ошибаюсь, ребята, не могли бы вы помочь мне?

Я заметил еще одну странную вещь, когда я удаляю весь код в основной функции, кроме первой строки «HBaseConfiguration conf = new HBaseConfiguration();», затем экспортирует код в файл jar и пытаюсь jar file as hadoop jar test.jar Я все равно получаю ту же ошибку. Кажется, я либо неправильно определяю конфигурацию conf, либо возникает некоторая проблема с моей средой.

ответ

4

У меня проблема с исправлением, я не добавил путь класса hbase в файл hadoop-env.sh. Ниже я добавил, чтобы работа работала.

$ 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="$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_HOME с вашим HBase полный путь

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

Я попытался отредактировать файл hadoop-env.sh, но изменения, упомянутые здесь, не работает для меня.

То, что работало это:

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

Я просто добавил, что в конце моего hadoop-env.sh. Не забудьте установить переменную HBASE_HOME. Вы также можете заменить $HBASE_HOME на фактический путь установки hbase.

0

здесь CreateTable мой файл класса Java

использовать эту команду

Hadoop @ osboxes: ~/HBase/HBase-0.94.8/бен $ ява -cp.: /home/hadoop/hbase/hbase-0.94.8/hbase-0.94.8.jar: /home/hadoop/hbase/hbase-0.94.8/lib/* CreateTable

Смежные вопросы