MapReduce 作业无法从 HBase 读取(抛出 java.lang.NoClassDefFoundError)

MapReduce job cannot read from HBase (throws java.lang.NoClassDefFoundError)

我的目标是 运行 Cloudera 集群上的一个简单的 MapReduce 作业,该作业从虚拟 HBase 数据库读取并写入 HDFS 文件

一些重要说明: - 我已经成功 运行 将 HDFS 文件作为输入的 MapReduce 作业 并在此集群上作为输出写入 HDFS 文件。 - 我已经将用于编译项目的库从 "purely" HBase 替换为 HBase-cloudera jars - 当我以前遇到这种问题时,我曾经简单地将一个库复制到分布式缓存中(使用 Google Guice 为我工作): JobConf conf = new JobConf(getConf(), ParseJobConfig.class); DistributedCache.addCacheFile(新 URI("/user/hduser/lib/3.0/guice-multibindings-3.0.jar"), conf); 但现在它不起作用,因为 HBaseConfiguration class 用于创建配置(在配置存在之前) - Cloudera版本为5.3.1,Hadoop版本为2.5.0

这是我的驱动代码:

public class HbaseJobDriver {
    public static void main(String[] args) throws Exception {
    Configuration conf = HBaseConfiguration.create();
    Job job = new Job(conf, "ExampleSummaryToFile");
    job.setJarByClass(HbaseJobDriver.class);

    Scan scan = new Scan();
    scan.setCaching(500); 
    scan.setCacheBlocks(false);

    TableMapReduceUtil.initTableMapperJob("Metrics", 
    scan, 
    HbaseJobMapper.class,
    Text.class,
    IntWritable.class, 
    job);

    job.setReducerClass(HbaseJobReducer.class); 
    job.setNumReduceTasks(1);
    FileOutputFormat.setOutputPath(job, new Path(args[0]));
  }
}

我不确定是否需要 mapper/reducer classes 来解决这个问题。

我得到的异常是: 线程 "main" java.lang.NoClassDefFoundError 中的异常:org/apache/hadoop/hbase/HBaseConfiguration

试试这个。

导出 HADOOP_CLASSPATH="/usr/lib/hbase/hbase.jar:$HADOOP_CLASSPATH"

在您的 /etc/hadoop/conf/hadoop-env.sh 文件中添加上述 属性 或从命令行设置它

错误Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration是由于缺少HBase jar。

如果@sravan 所说的不起作用,请尝试在您的驱动程序代码(导入部分)中导入 HBaseConfiguration,如下所示:

import org.apache.hadoop.hbase.HBaseConfiguration;

我们刚刚和我的同事一起解决了这个问题,在我们的例子中我们需要更新 .bashrc 文件:

  1. nano ~/.bashrc
  2. 像这样将库放到类路径中:

HBASE_PATH=/opt/cloudera/parcels/CDH/jars

export HADOOP_CLASSPATH=${HBASE_PATH}/hbase-common-0.98.6-cdh5.3.1.jar:<ANY_OTHER_JARS_REQUIRED>

  1. 别忘了重新加载 bashrc:

. .bashrc