我的目标是在Cloudera集群上运行一个简单的MapReduce作业,该集群从虚拟HBase数据库读取并写入HDFS文件。
一些重要说明: - 我已经成功运行了将HDFS文件作为输入的MapReduce作业 并在此之前写入HDFS文件作为此群集的输出。 - 我已经将用于编译项目的库从“纯粹的”HBase替换为HBase-cloudera jar - 当我以前遇到过这种问题时,我曾经只是将一个lib复制到分布式缓存中(使用Google Guice为我工作): JobConf conf = new JobConf(getConf(),ParseJobConfig.class); DistributedCache.addCacheFile(新URI(“/ user / hduser / lib / 3.0 / guice-multibindings-3.0.jar”),conf); 但现在它不起作用,因为HBaseConfiguration类用于创建配置(在配置存在之前) - 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类来解决这个问题。
我得到的例外是: 线程“main”中的异常java.lang.NoClassDefFoundError:org / apache / hadoop / hbase / HBaseConfiguration
答案 0 :(得分:1)
我们刚刚和我的同事一起解决了这个问题,在我们的案例中我们需要更新.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
答案 1 :(得分:0)
试试这个。
export HADOOP_CLASSPATH =“/ usr / lib / hbase / hbase.jar:$ HADOOP_CLASSPATH”
在/etc/hadoop/conf/hadoop-env.sh文件中添加以上属性或从命令行设置
答案 2 :(得分:0)
错误Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
是由于缺少HBase jar。
如果@sravan说不起作用,那么尝试在你的驱动程序代码(导入部分)中导入HBaseConfiguration,如下所示:
import org.apache.hadoop.hbase.HBaseConfiguration;