您好我是hadoop的新手,我正在尝试使用MapReduce将csv表导入Hbase。
我使用的是hadoop 1.2.1和hbase 1.1.1
我有以下格式的数据:
Wban Number, YearMonthDay, Time, Hourly Precip
03011,20060301,0050,0
03011,20060301,0150,0
我已经为批量加载编写了以下代码
public class BulkLoadDriver extends Configured implements Tool{
public static void main(String [] args) throws Exception{
int result= ToolRunner.run(HBaseConfiguration.create(), new BulkLoadDriver(), args);
}
public static enum COUNTER_TEST{FILE_FOUND, FILE_NOT_FOUND};
public String tableName="hpd_table";// name of the table to be inserted in hbase
@Override
public int run(String[] args) throws Exception {
//Configuration conf= this.getConf();
Configuration conf = HBaseConfiguration.create();
Job job= new Job(conf,"BulkLoad");
job.setJarByClass(getClass());
job.setMapperClass(bulkMapper.class);
FileInputFormat.setInputPaths(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
TableMapReduceUtil.initTableReducerJob(tableName, null, job); //for HBase table
job.setNumReduceTasks(0);
return (job.waitForCompletion(true)?0:1);
}
private static class bulkMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put>{
//static class bulkMapper extends TableMapper<ImmutableBytesWritable, Put> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
String [] val= value.toString().split(",");
// store the split values in the bytes format so that they can be added to the PUT object
byte[] wban=Bytes.toBytes(val[0]);
byte[] ymd= Bytes.toBytes(val[1]);
byte[] tym=Bytes.toBytes(val[2]);
byte[] hPrec=Bytes.toBytes(val[3]);
Put put=new Put(wban);
put.add(ymd, tym, hPrec);
System.out.println(wban);
context.write(new ImmutableBytesWritable(wban), put);
context.getCounter(COUNTER_TEST.FILE_FOUND).increment(1);
}
}
}
我为此创建了一个jar并在终端中运行了以下内容:
hadoop jar~ / hadoop-1.2.1 / MRData / bulkLoad.jar bulkLoad.BulkLoadDriver /MR/input/200603hpd.txt hpd_table
但是我获得的输出是以下数百种类型的行: attempt_201509012322_0001_m_000000_0:[B @ 2d22bfc8 attempt_201509012322_0001_m_000000_0:[B @ 445cfa9e
我不确定它们是什么意思以及如何执行此批量上传。请帮忙。
提前致谢。
答案 0 :(得分:2)
有几种方法可以将数据导入HBase。请看下面这个链接:
http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/admin_hbase_import.html
HBase BulkLoad:
CSV格式的数据文件
将数据处理为HFile格式。有关HFile格式的详细信息,请参阅http://hbase.apache.org/book/hfile_format.html。通常您使用MapReduce作业进行转换,并且您经常需要自己编写Mapper,因为您的数据是唯一的。作业必须将行键作为键发出,并将KeyValue,Put或Delete作为值发出。 Reducer由HBase处理;使用HFileOutputFormat.configureIncrementalLoad()配置它,它执行以下操作:
在输出文件夹中为每个区域创建一个HFile。输入数据几乎完全重写,因此您需要的可用磁盘空间至少是原始数据集大小的两倍。例如,对于mysqldump的100 GB输出,HDFS中至少应有200 GB的可用磁盘空间。您可以在流程结束时删除原始输入文件。
将文件加载到HBase中。使用LoadIncrementalHFiles命令(通常称为completebulkload工具),向其传递一个URL,用于定位HDFS中的文件。每个文件都加载到RegionServer的相关区域中。您可以通过传递--versions = N选项来限制加载的版本数,其中N是要包括的最大版本数,从最新到最旧(最大时间戳到最小时间戳)。 如果在创建文件后拆分了某个区域,该工具会根据新边界自动拆分HFile。此过程效率低下,因此如果您的表由其他进程写入,则应在转换步骤完成后立即加载。