【问题标题】:ClassNotFound Exception when running a HbaseMapreduce Program运行 Hbase Mapreduce 程序时出现 ClassNotFoundException
【发布时间】:2012-09-06 13:06:37
【问题描述】:

我是 Hbase 的新手,我正在尝试一些示例示例来将数据从文件加载到 Htable。我从 Eclipse 创建了一个 jar 并将 jar 和输入文件存储在 HDFS 目录中并开始运行 jar:

hadoop jar $HADOOP_HOME/CSV2HBASE.jar /home/hbaseuser/input.csv csv_table

然后我遇到了异常

Warning: $HADOOP_HOME is deprecated.

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
        at com.stratapps.hbase.CSV2HBase.main(CSV2HBase.java:67)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.HBaseConfiguration
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 6 more

我的输入文件是:

row1    f1  cl1 0.12
row2    f1  cl1 0.35
row3    f1  cl1 1.58
row4    f1  cl1 2.73
row5    f1  cl1 0.93

和类:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class CSV2HBase {

  private static final String NAME = "CSV2HBase";

  static class Uploader extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> {

    @Override
    public void map(LongWritable key, Text line, Context context)throws IOException 
    {

      String [] values = line.toString().split(",");
      if(values.length != 4) {
    System.out.println("err values.length!=4 len:"+values.length);
    System.out.println("input string is:"+line);
        return;
      }
      // Extract each value
      byte [] row = Bytes.toBytes(values[0]);
      byte [] family = Bytes.toBytes(values[1]);
      byte [] qualifier = Bytes.toBytes(values[2]);
      byte [] value = Bytes.toBytes(values[3]);
      Put put = new Put(row);
      put.add(family, qualifier, value);

      try {
        context.write(new ImmutableBytesWritable(row), put);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }


    }
  }
  public static Job configureJob(Configuration conf, String [] args)
  throws IOException {
    Path inputPath = new Path(args[0]);
    String tableName = args[1];
    Job job = new Job(conf, NAME + "_" + tableName);
    job.setJarByClass(Uploader.class);
    FileInputFormat.setInputPaths(job, inputPath);
    job.setInputFormatClass(TextInputFormat.class);
    job.setMapperClass(Uploader.class);

    TableMapReduceUtil.initTableReducerJob(tableName, null, job);
    job.setNumReduceTasks(0);
    return job;
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.zookeeper.quorum","172.16.17.55");
    conf.set("hbase.zookeeper.property.clientPort","2181");
     String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if(otherArgs.length != 2) {
      System.err.println("Wrong number of arguments: " + otherArgs.length);
      System.err.println("Usage: " + NAME + " <input> <tablename>");
      System.exit(-1);
    }
    Job job = configureJob(conf, otherArgs);
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

请任何人解决我面临的问题。我将 jar 文件保存在 ${HADOOP_HOME} 中,但我仍然遇到 classnotfound 异常

【问题讨论】:

    标签: hadoop mapreduce hbase


    【解决方案1】:

    您必须将这些类添加到您的 CLASSPATH 中,或者在导出时使用 Eclipse 将它们打包到您的 JAR 中。

    【讨论】:

    • 我在导出和创建 jar 文件时添加到类路径,但仍然出现错误
    • (取决于您的 Eclipse 版本)当您将 Eclipse 导出到可运行的 JAR 文件时,您在库处理下选择什么选项?
    • 将所需的库提取到我选择的生成的 jar 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2013-01-16
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多