10T的数据如何快速导入到HBASE呢?本文介绍一种高效快速的导入方法
处理思路:
1、如果要求快速就必须是利用分布式集群的并行运算能力
2、将数据放入HDFS中,实现一次写入多出读
3、通过MR并行处理并生产HFILE文件
4、导入HFILE文件进入数据库
编写一个Map程序生产HFile格式的文件
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
ImmutableBytesWritable rowkey = new ImmutableBytesWritable(
value.toString().split(",")[0].getBytes());
List<KeyValue> list = null;
list = createKeyValue(value.toString());
Iterator<KeyValue> it = list.iterator();
while (it.hasNext()) {
KeyValue kv = new KeyValue();
kv = it.next();
if (kv != null) {
context.write(rowkey, kv);
}
以下是导入数据到hbase
job.setJarByClass(ImportToHBase.class);
//设置Map任务输出Key-Value类型,一定要为该类型,Value可以改为HBase的Put类型
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(KeyValue.class);
//设置Mapper与Reducer类
job.setMapperClass(HFileGenerateMapper.class);
job.setReducerClass(KeyValueSortReducer.class);
job.setOutputFormatClass(HFileOutputFormat2.class);
FileSystem fs = FileSystem.get(URI.create("/"),conf);
Path outPath = new Path(PATH_OUT);
if (fs.exists(outPath))fs.delete(outPath, true);
FileInputFormat.setInputPaths(job, new Path(PATH_IN));
FileOutputFormat.setOutputPath(job, outPath);
HTable table = new HTable(conf, TABLENAME);
HFileOutputFormat2.configureIncrementalLoad(job, table);
if(job.waitForCompletion(true)){
LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
loader.doBulkLoad(outPath, table);
}
其实编码的过程很简单,但是必须面对思考的问题:
1、程序中没有定义Reduce,为什么不定义Reduce,或者Reduce起什么作用?
我们知道,Hbase里面的Rowkey是排序的,如果没有Reduce的话数据进入Hbase时候可能出现rowkey是非排序写入的,导致数据写入失败
2、导入过程是Reduce输出的过程,如果提升速度呢?
1、预定义分区,默认每个分区对应一个Reduce
2、预定义分区,以减少大量数据导入过程导致的Hbase中Region不停的Split
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论