尘世随缘
作者尘世随缘·2015-05-08 16:19
技术总监·上海某互联网金融公司

数据快速批量快速导入HBASE方法

字数 2966阅读 4826评论 0赞 0

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 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广