HBase大量导入数据时,使用client方式将会导致大量网络IO以及损耗集群计算资源,Hbase官方的bulkloader可以很好解决这个场景。
bulkloader支持将写成HFile格式的数据直接放入HBase,这个过程分为:
1.准备HFile格式的文件于HDFS中:
本样例代码场景为读取另一个HBase表中的数据,写为HFile格式。
其中写入方式可以通过MR任务完成,输出部分key和value的类型必须是: < ImmutableBytesWritable, KeyValue>或者< ImmutableBytesWritable, Put>。
最终输出部分,Value类型是KeyValue 或Put,对应的Sorter分别是KeyValueSortReducer或PutSortReducer。
MR例子中job.setOutputFormatClass(HFileOutputFormat.class); HFileOutputFormat只适合一次对单列族组织成HFile文件。
@Override
public MapreduceResult runMapreduce(Properties properties) {
try {
properties.setProperty("mapreduce.hdfs.output", "/user/yingzz/hbase/output2");
properties.setProperty(ConstantsDef.HBASE_SOURCE_ZK_QUORUM, "127.0.0.1:2181");
properties.setProperty(ConstantsDef.HBASE_SOURCE_NAMESERVER_ADDR, "default");
properties.setProperty(ConstantsDef.HBASE_SOURCE_TABLE, "tablename");
Scan scan = new Scan();
scan.setMaxVersions(1);
Job job = this.createHbaseInputJob(scan, HFileOutputFormat2.class,
NullWritable.class, Text.class,
NullWritable.class, Text.class, XxxMapper.class,
null, null, properties);
boolean success = job.waitForCompletion(true);
if(success){
return new MapreduceResult(MapreduceResult.EJOB_RUN_SUCCESSED);
}
} catch (Exception e) {
e.printStackTrace();
}
return new MapreduceResult(MapreduceResult.EJOB_RUN_FAILED);
}
}
public class XxxMapper ext