`
zhan8610189
  • 浏览: 75461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

批量Load到HBase

阅读更多

hbase提供了写的操作,通常,我们可以采用HBase的Shell 客户端或者Java API进行操作。

如果数据量大的话,这两种操作是很费时的。其实如果了解了HBase的数据底层存储的细节的话,HBase的数据存储格式是HFile定义的格式。

批量导入HBase主要分两步:

  • 通过mapreduce在输出目录OutputDir下生成一系列按Store存储结构一样的,存储HFile文件
  • 通过LoadIncrementalHFiles.doBulkLoad把OutputDir里面的数据导入HBase表中
优点
  1. HBase提供了一种直接写hfile文件的类,同时通过类似传统数据库的load把这些文件写进去,不再需要通过客户端或Java API一条一条插进去,
  2. 这些接口简单方便,快捷灵活;
  3. 应用不需要一直去连HBase集群进行RPC multi写,提高mapreduce效率;
  4. HBase集群也相应减少不必要的连接,可以让它去多干些其它的事,效率更加高效,降低HBase集群因为大量并发写而产生不必要的风险。
1. 从HDFS批量导入

在MapReduce里面就把想要的输出成HFileOutputFormat格式的文件,然后通过LoadIncrementalHFiles.doBulkLoad方式就可以load进去即可。例子如下: 

Configuration conf = getConf();
conf.set("hbase.table.name", args[2]);
// Load hbase-site.xml
HBaseConfiguration.addHbaseResources(conf);
Job job = new Job(conf, "HBase Bulk Import Example");
job.setJarByClass(Mapper2.class);
job.setMapperClass(Mapper2.class);
job.setMapOutputKeyClass(ImmutableBytesWritable.class);
job.setMapOutputValueClass(KeyValue.class);
job.setInputFormatClass(TextInputFormat.class);

// Auto configure partitioner and reducer
HTable hTable = new HTable(conf, args[2]);
HFileOutputFormat.configureIncrementalLoad(job, hTable);

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);

// Load generated HFiles into table
LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
loader.doBulkLoad(new Path(args[1]), hTable);
2. 从MySQL批量导入

这个星期把一些MySQL表导到线上HBase表。这个MySQL表散了100份,在HBase集群未提供向业务使用时,通过Sqoop工具导进HBase表所花费的时间大约32个小时(已串行化),在hbase集群繁忙时,花了10个小时都还没有把一张表导到HBase里面。这是有原因的,Sqoop未实现批量导的功能,它通常是边读边写。

后来自己写了一个从MySQL批量导入HBase的应用程序,每个表导入HBase所需时间平均只需要8分钟。

核心代码如下:

    HBaseConfiguration.addHbaseResources(conf);

    Job job = new Job(conf, "Load_MySQL_" + table + "_to_HBase_" + hbaseTable);
    // 用来读mysql的Mapper
    job.setJarByClass(MysqlMapper.class);

    job.setMapperClass(MysqlMapper.class);
    job.setMapOutputKeyClass(ImmutableBytesWritable.class);
    job.setMapOutputValueClass(KeyValue.class);
    //配置DB参数
    DBConfiguration.configureDB(job.getConfiguration(), driver, connect, username, password);
    DataDrivenDBInputFormat.setInput(job, dbWritableClass, query, boundaryQuery);
    DataDrivenDBInputFormat.setInput(job, dbWritableClass, table, conditions, splitBy, columns);
    //设置输出路径
    FileOutputFormat.setOutputPath(job, new Path(tmpTargetDir));
    // 自动设置partitioner和reduce
    HTable hTable = new HTable(conf, hbaseTable);
    HFileOutputFormat.configureIncrementalLoad(job, hTable);

    job.waitForCompletion(true);

    // 上面JOB运行完后,就把数据批量load到HBASE中
    LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
    loader.doBulkLoad(new Path(tmpTargetDir), hTable);

 

分享到:
评论
17 楼 xiezhenyuan 2014-04-22  
您好!非常感谢您共享了这么宝贵的资料,本人水平很低,在研究您传到github上补丁时发现和我现在使用的版本1.4.x不大一样,不知道您是用什么版本打的补丁,您有没有完整版的jar包啊。另外您在本文第二部分里面写到从数据库导入到hbase时,使用了一个mysqlmapper.class,实在是知道里面怎样实现的将数据库数据作为map输入的,能否发给我一份代码参考一下啊,多谢!邮箱地址是540568419@qq.com
16 楼 anny_cjh 2013-10-31  
楼主,我是刚学hbase的,现在是想把ms sql的数据导到hbase上,能否给一份源码?我的邮箱是:anny_free@sohu.com,多谢!
15 楼 zhan8610189 2013-08-09  
liu0415 写道

给个链接吧,github搜不到,谢谢!


看我的个人资料,上面有github地址
14 楼 liu0415 2013-08-08  
zhan8610189 写道
liu0415 写道

楼主,好人啊!我最近也在做oracle到hbase增量导入工作,初学者,请问能把完整代码发给我一份吗?我的邮箱是xingxing85384073@126.com,非常感谢!你的sqoop批量导入的命令和使用!
  
不胜感激!


在我的github上有sqoop的源码。

给个链接吧,github搜不到,谢谢!
13 楼 zhan8610189 2013-08-07  
liu0415 写道

楼主,好人啊!我最近也在做oracle到hbase增量导入工作,初学者,请问能把完整代码发给我一份吗?我的邮箱是xingxing85384073@126.com,非常感谢!你的sqoop批量导入的命令和使用!
  
不胜感激!


在我的github上有sqoop的源码。
12 楼 liu0415 2013-08-06  

楼主,好人啊!我最近也在做oracle到hbase增量导入工作,初学者,请问能把完整代码发给我一份吗?我的邮箱是xingxing85384073@126.com,非常感谢!你的sqoop批量导入的命令和使用!
  
不胜感激!
11 楼 zhan8610189 2013-07-23  
anxiong 写道
[

谢谢!数据不会Delete,Update的概率很小,Add的概率略大,但仍然是小概率事件;我也在犹豫是否采用(qualifer1,qualifer2,...)来处理1:N问题;还有一个问题是:我每次只想处理新增的数据,我怎么判断HDFS是新增的呢?是不是我处理完了要不上次生成的QueryResult.java干掉!


批量导到hdfs上的话,你可以存一个新文件,分析就只需要分析这个文件。分析完做合并操作就可以。
QueryResult.java需要干掉么?
hdfs本来就不太适合做增量分析的。
hbase做增量分析也不太适合,但是你也可以去读出timestamp或者其它column字段 的值来做增量分析。


10 楼 anxiong 2013-07-23  
zhan8610189 写道
anxiong 写道
zhan8610189 写道
anxiong 写道
您好!我最近也在做oracle到hbase增量导入工作,请问能把完整代码发给我一份吗?我的邮箱是lyxiong78@163.com,非常感谢!


hbase增量导入工作sqoop有这样的机制,你可以学习一下sqoop。同时,我也已经对sqoop的补丁也开源了。

非常感谢您的回答!我的数据导入流程是:1.用sqoop将oracle所有表导入到hdfs,然后写mapreduce程序把hdfs(多表)的数据导入Hbase(合并为一个表)。我现在最大的问题是:Oracle里有很多1:N的主子表,我想把字表的数据合并为一个值(value1,value2,value3....),我不知道并值这一步在哪里处理、如何处理?谢谢


首先,你确定你需要以值(value1,value2,value3....)这样的方式存不?如果今后要对其hbase子表的数据进行修改,你就需要判断是删除了value2,或是value3?

如果有必要的话,请修改sqoop的codegen后生成的QueryReult.java代码,在那里面就可以进行修改成自己需要的格式。


谢谢!数据不会Delete,Update的概率很小,Add的概率略大,但仍然是小概率事件;我也在犹豫是否采用(qualifer1,qualifer2,...)来处理1:N问题;还有一个问题是:我每次只想处理新增的数据,我怎么判断HDFS是新增的呢?是不是我处理完了要不上次生成的QueryResult.java干掉!
9 楼 zhan8610189 2013-07-22  
anxiong 写道
zhan8610189 写道
anxiong 写道
您好!我最近也在做oracle到hbase增量导入工作,请问能把完整代码发给我一份吗?我的邮箱是lyxiong78@163.com,非常感谢!


hbase增量导入工作sqoop有这样的机制,你可以学习一下sqoop。同时,我也已经对sqoop的补丁也开源了。

非常感谢您的回答!我的数据导入流程是:1.用sqoop将oracle所有表导入到hdfs,然后写mapreduce程序把hdfs(多表)的数据导入Hbase(合并为一个表)。我现在最大的问题是:Oracle里有很多1:N的主子表,我想把字表的数据合并为一个值(value1,value2,value3....),我不知道并值这一步在哪里处理、如何处理?谢谢


首先,你确定你需要以值(value1,value2,value3....)这样的方式存不?如果今后要对其hbase子表的数据进行修改,你就需要判断是删除了value2,或是value3?

如果有必要的话,请修改sqoop的codegen后生成的QueryReult.java代码,在那里面就可以进行修改成自己需要的格式。
8 楼 anxiong 2013-07-22  
zhan8610189 写道
anxiong 写道
您好!我最近也在做oracle到hbase增量导入工作,请问能把完整代码发给我一份吗?我的邮箱是lyxiong78@163.com,非常感谢!


hbase增量导入工作sqoop有这样的机制,你可以学习一下sqoop。同时,我也已经对sqoop的补丁也开源了。

非常感谢您的回答!我的数据导入流程是:1.用sqoop将oracle所有表导入到hdfs,然后写mapreduce程序把hdfs(多表)的数据导入Hbase(合并为一个表)。我现在最大的问题是:Oracle里有很多1:N的主子表,我想把字表的数据合并为一个值(value1,value2,value3....),我不知道并值这一步在哪里处理、如何处理?谢谢
7 楼 zhan8610189 2013-07-20  
anxiong 写道
您好!我最近也在做oracle到hbase增量导入工作,请问能把完整代码发给我一份吗?我的邮箱是lyxiong78@163.com,非常感谢!


hbase增量导入工作sqoop有这样的机制,你可以学习一下sqoop。同时,我也已经对sqoop的补丁也开源了。
6 楼 anxiong 2013-07-19  
zhan8610189,由于我刚接触hadoop两个多月,很多东西还不是很熟悉,工作有些压力,希望能得到您的帮助!谢谢
5 楼 anxiong 2013-07-19  
您好!我最近也在做oracle到hbase增量导入工作,请问能把完整代码发给我一份吗?我的邮箱是lyxiong78@163.com,非常感谢!
4 楼 naygnosuw 2013-05-29  
zhan8610189 写道
naygnosuw 写道
最近刚好在研究这个
想请问一下有完整的代码能提供吗
如果可以的话麻烦发到我的邮箱
naygnosuw@qq.com


已发,你也可以看一下我打的sqoop补丁。

我昨天有收到,我还有一些问题
有回了一封mail
请问有收到吗
3 楼 zhan8610189 2013-05-28  
naygnosuw 写道
最近刚好在研究这个
想请问一下有完整的代码能提供吗
如果可以的话麻烦发到我的邮箱
naygnosuw@qq.com


已发,你也可以看一下我打的sqoop补丁。
2 楼 zhan8610189 2013-05-27  
naygnosuw 写道
最近刚好在研究这个
想请问一下有完整的代码能提供吗
如果可以的话麻烦发到我的邮箱
naygnosuw@qq.com


好的,我明天到公司里发给你啦。
1 楼 naygnosuw 2013-05-27  
最近刚好在研究这个
想请问一下有完整的代码能提供吗
如果可以的话麻烦发到我的邮箱
naygnosuw@qq.com

相关推荐

Global site tag (gtag.js) - Google Analytics