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 文件:
nano ~/.bashrc
- 像这样将库放到类路径中:
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>
- 别忘了重新加载 bashrc:
. .bashrc
我的目标是 运行 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 文件:
nano ~/.bashrc
- 像这样将库放到类路径中:
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>
- 别忘了重新加载 bashrc:
. .bashrc