Я использую 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, либо возникает некоторая проблема с моей средой.