利用sqoop从mysql向hbase导数据(拼接mysql多字段做为hbase rowkey)

来源:互联网 发布:信封数据 编辑:程序博客网 时间:2024/04/30 11:52

说说自己的思路,路过的朋友请帮忙指正或提新建议,万分感谢。


场景介绍:

自己在mysql中有1张表,每天2GB左右的统计数据,,因为资源原因需定期删除。

但有其他场景需要保存1年以上,所以想把数据备份在hbase里,同时还要能支持准实时查询。


选择Sqoop原因: 

希望以后能有一个较通用的数据迁移方案(在mysql和hbase/hive/hdfs之间),尽量减少重复代码的开发与维护。


测试场景(已验证)

假设在数据库实例 logdb 中有一张表:system_log, 包含如下五个字段: 

id: int(12) PRI  AUTO_INCREMENT  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

mytime: datetime (格式:2015-12-12 12:12:12)

mytype: varchar(128)

value1: varchar(256)

value2: varchar(256)

为了提高查询效率,我设计hbase rowkey如下: mytype_mytime_id,  列族(cf)中有两列:cf:value1,  cf:value2。因为我的查找需求就是查询某个mytype在指定时间段内的属性值。


具体测试步骤: 

<1> 创建一张临时表 system_log_tmp

        CREATE TABLE system_log_tmp LIKE system_log;

<2> 将昨日增量数据copy至该临时表

         INSERT system_log_Tmp SELECT * FROM system_log 

<3> 给临时表添加新列 hbase_row_key

        ALTER  TABLE  system_log_tmp  ADD COLUMN hbase_row_key   varchar(256)

<4> 在临时表中通过拼接对应三列来补全新列内容(为方便查询,ID字段统一为11位,不够右侧补零;为节省空间,mytime字段改为20151212121212样式)

        UPDATE system_log_tmp  SET  hbase_row_key=concat( type, ':', date_format(time, '%Y%m%d%H%i%s'),  ':',  right(  concat('000000000000', id), 12))

<5> 运行sqoop命令,将数据从临时表导入hbase: 

        ./bin/sqoop  import  --connect  jdbc:mysql://testPC:3306/logdb  --table  system_log_tmp   --hbase-table   system_log  --column-family  cf     --hbase-row-key  hbase_row_key  --hbase-create-table   --username 'root'  -P;

      如果第五步不成功,请检查sqoop是否安装正确,以及Hadoop Resource Manager是否启动(可通过hadoop web UI排查错误)。

      最后简单介绍下第<5>步命令中的参数: 

     --connect:  指明源db为testPC上的logdb

     --table:       指明源表为logdb中的system_log_tmp

     --hbase-table:  指明hbase中的目标表名称 

     --column-family: 指明hbase中目标表内的列族

     --hbase-row-key: 指明要用mysql中的哪一列作为hbase表中的rowkey

     --hbase-create-table: 指明是否需要创建hbase表

     --username: 指明mysql账户

     --P:会提示输入mysql账户密码


IT人的微信自媒体--- 杰天空, 走在寻找创意的路上

发掘创意,点缀生活,品味人生。
请搜索微信订阅号:
 jksy_studio ,或者微信扫描头像二维码添加关注


  

0 0