Sqoop将MySQL数据库表中数据导入到HBase表中

问题导读:

        1、--hbase-table、--hbase-row-key、--column-family及--hbase-create-table参数的作用?

        2、Sqoop将关系型数据库表中数据导入HBase中,默认Rowkey是什么?

        3、如果关系型数据库表中存在多关键字,该怎么办?

一、简介及部分重要参数介绍

        Sqoop除了能够将数据从关系型数据库导入到HDFS和Hive中,还能够导入到HBase表中。
       --hbase-table:通过指定--hbase-table参数值,指明将数据导入到HBase表中,而不是HDFS上的一个目录。输入表中的每一行将会被转换成一个HBase Put操作的输出表的一行。
       --hbase-row-key:你可以使用--hbase-row-key参数,手动的指定row key。默认的情况下,Sqoop会将split-by 列作为HBase rowkey列。如果没有指定split-by值,它将会试图识别关系表的关键字。

       如果源表是组合关键字,--hbase-row-key 参数后面值是用逗号分隔的组合关键字属性的列表,在这样种情况下,通过合并组合关键字属性的值来产生HBase的Row key,每个值之间使用下划线分隔开来

       --column-family:必须指定--column-family参数,每一个输出列都会被放到同一个family列族中。  

      --hbase-create-table:如果HBase中的目标表和列族不存在,如果你使用该参数,Sqoop在运行任务的时候会根据HBase的默认配置,首先创建目标表和列族

       注意一:当源表中是组合关键字的时候,必须手动指定--hbase-row-key参数,Sqoop才能将数据导入到HBase中,否则不行。
       注意二:如果HBase中的目标表和列族不存在,如果没加--hbase-create-table参数,Sqoop job将会报错误退出运行。所以你在将数据从源表导入到HBase之前,需要首先在HBase中创建目标表和其对应的列族。
      Sqoop目前会序列化所有的字段值,将值转换为字符串表示,然后向HBase中插入UTF-8编码的字符串值的二进制值。

二、原始数据如下

[html]  view plain  copy
  1. mysql> select * from user;  
  2. +----+-----------+--------------+--------------+  
  3. | id | name      | address      | school       |  
  4. +----+-----------+--------------+--------------+  
  5. |  1 | 张三丰    | 五台山       | 安徽大学     |  
  6. |  2 | 黄易某    | 江苏南京     | 南京大学     |  
  7. |  3 | 李四      | 江苏苏州     | 苏州大学     |  
  8. |  4 | 王海      | 江苏南京     |              |  
  9. |  5 | 小德子    |              | 清华大学     |  
  10. +----+-----------+--------------+--------------+  
  11. 5 rows in set (0.00 sec)  
     上面id是关键字

三、以单关键字作为Rowkey导入

[html]  view plain  copy
  1. [hadoopUser@secondmgt ~]$ sqoop import --connect jdbc:mysql://secondmgt:3306/test --username hive --password hive --table user --split-by id --hbase-table sqooptest --column-family stuInfo  

       以--split-by id作为Rowkey导入,不加此参数,默认情况下也是以id作为RowKey导入的。执行报如下错误:

[html]  view plain  copy
  1. 15/01/19 19:17:29 INFO mapreduce.Job: Running job: job_1421373857783_0029  
  2.     15/01/19 19:17:43 INFO mapreduce.Job: Job job_1421373857783_0029 running in uber mode : false  
  3.     15/01/19 19:17:43 INFO mapreduce.Job:  map 0% reduce 0%  
  4.     15/01/19 19:17:54 INFO mapreduce.Job: Task Id : attempt_1421373857783_0029_m_000001_0, Status : FAILED  
  5.     Error: java.lang.RuntimeException: Could not access HBase table sqooptest  
  6.         at org.apache.sqoop.hbase.HBasePutProcessor.setConf(HBasePutProcessor.java:122)  
  7.         at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)  
  8.         at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)  
  9.         at org.apache.sqoop.mapreduce.DelegatingOutputFormat$DelegatingRecordWriter.<init>(DelegatingOutputFormat.java:107)  
  10.         at org.apache.sqoop.mapreduce.DelegatingOutputFormat.getRecordWriter(DelegatingOutputFormat.java:82)  
  11.         at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.<init>(MapTask.java:623)  
  12.         at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:743)  
  13.         at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)  
  14.         at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)  
  15.         at java.security.AccessController.doPrivileged(Native Method)  
  16.         at javax.security.auth.Subject.doAs(Subject.java:415)  
  17.         at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)  
  18.         at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)  
      由错误日志可知,是由于无法访问sqooptest表导致,排除连接问题后,查看发现原来是HBase中没有该表。解决办法如下:

     1、先在HBase中创建sqooptest表

[html]  view plain  copy
  1. hbase(main):006:0> create 'sqooptest','stuInfo'  
  2. 0 row(s) in 1.5930 seconds  
  3. => Hbase::Table - sqooptest  
  4. hbase(main):007:0> list  
  5. TABLE  
  6. sqooptest  
  7. yzjt  
  8. 2 row(s) in 0.0290 seconds  
       再次执行,查看结果
[html]  view plain  copy
  1. hbase(main):012:0> scan 'sqooptest'  
  2. ROW          COLUMN+CELL  
  3.  1           column=stuInfo:address, timestamp=1421665851147value=\xE4\xBA\x94\xE5\x8F\xB0\xE5\xB1\xB1  
  4.  1           column=stuInfo:name, timestamp=1421665851147value=\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0  
  5.  1           column=stuInfo:school, timestamp=1421665851147value=\xE5\xAE\x89\xE5\xBE\xBD\xE5\xA4\xA7\xE5\xAD\xA6  
  6.  2           column=stuInfo:address, timestamp=1421665846096value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC  
  7.  2           column=stuInfo:name, timestamp=1421665846096value=\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90  
  8.  2           column=stuInfo:school, timestamp=1421665846096value=\xE5\x8D\x97\xE4\xBA\xAC\xE5\xA4\xA7\xE5\xAD\xA6  
  9.  3           column=stuInfo:address, timestamp=1421665850852value=\xE6\xB1\x9F\xE8\x8B\x8F\xE8\x8B\x8F\xE5\xB7\x9E  
  10.  3           column=stuInfo:name, timestamp=1421665850852value=\xE6\x9D\x8E\xE5\x9B\x9B  
  11.  3           column=stuInfo:school, timestamp=1421665850852value=\xE8\x8B\x8F\xE5\xB7\x9E\xE5\xA4\xA7\xE5\xAD\xA6  
  12.  4           column=stuInfo:address, timestamp=1421665858288value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC  
  13.  4           column=stuInfo:name, timestamp=1421665858288value=\xE7\x8E\x8B\xE6\xB5\xB7  
  14.  4           column=stuInfo:school, timestamp=1421665858288value=  
  15.  5           column=stuInfo:address, timestamp=1421665862608value=  
  16.  5           column=stuInfo:name, timestamp=1421665862608value=\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90  
  17.  5           column=stuInfo:school, timestamp=1421665862608value=\xE6\xB8\x85\xE5\x8D\x8E\xE5\xA4\xA7\xE5\xAD\xA6  
  18. 5 row(s) in 0.0650 seconds  
     2、添加--hbase-create-table参数,使Sqoop在导入之前先在HBase中创建对应表及列族。

           以sqooptest2表为例演示如下:

[html]  view plain  copy
  1. [hadoopUser@secondmgt ~]$ sqoop import --connect jdbc:mysql://secondmgt:3306/test --username hive --password hive --table user --split-by id --hbase-table sqooptest2 --column-family stuInfo --hbase-create-table   
  2.   
  3. hbase(main):020:0> scan 'sqooptest2'  
  4. ROW              COLUMN+CELL  
  5.  1               column=stuInfo:address, timestamp=1421667190477value=\xE4\xBA\x94\xE5\x8F\xB0\xE5\xB1\xB1  
  6.  1               column=stuInfo:name, timestamp=1421667190477value=\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0  
  7.  1               column=stuInfo:school, timestamp=1421667190477value=\xE5\xAE\x89\xE5\xBE\xBD\xE5\xA4\xA7\xE5\xAD\xA6  
  8.  2               column=stuInfo:address, timestamp=1421667185489value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC  
  9.  2               column=stuInfo:name, timestamp=1421667185489value=\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90  
  10.  2               column=stuInfo:school, timestamp=1421667185489value=\xE5\x8D\x97\xE4\xBA\xAC\xE5\xA4\xA7\xE5\xAD\xA6  
  11.  3               column=stuInfo:address, timestamp=1421667190279value=\xE6\xB1\x9F\xE8\x8B\x8F\xE8\x8B\x8F\xE5\xB7\x9E  
  12.  3               column=stuInfo:name, timestamp=1421667190279value=\xE6\x9D\x8E\xE5\x9B\x9B  
  13.  3               column=stuInfo:school, timestamp=1421667190279value=\xE8\x8B\x8F\xE5\xB7\x9E\xE5\xA4\xA7\xE5\xAD\xA6  
  14.  4               column=stuInfo:address, timestamp=1421667198066value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC  
  15.  4               column=stuInfo:name, timestamp=1421667198066value=\xE7\x8E\x8B\xE6\xB5\xB7  
  16.  4               column=stuInfo:school, timestamp=1421667198066value=null  
  17.  5               column=stuInfo:address, timestamp=1421667201685value=null  
  18.  5               column=stuInfo:name, timestamp=1421667201685value=\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90  
  19.  5               column=stuInfo:school, timestamp=1421667201685value=\xE6\xB8\x85\xE5\x8D\x8E\xE5\xA4\xA7\xE5\xAD\xA6  
  20. 5 row(s) in 0.0360 seconds  

三、手动指定Rowkey

         禁用、删除掉之前创建的sqooptest表,演示手动指定Rowkey的情形。我们以id+name组合表示RowKey,如下:

[html]  view plain  copy
  1. [hadoopUser@secondmgt ~]$ sqoop import --connect jdbc:mysql://secondmgt:3306/test --username hive --password hive --table user --split-by id --hbase-table sqooptest --column-family stuInfo --hbase-create-table --hbase-row-key id,name  
        查看结果:

[html]  view plain  copy
  1. hbase(main):026:0> list  
  2. TABLE  
  3. sqooptest  
  4. yzjt  
  5. 2 row(s) in 0.0430 seconds  
  6.   
  7. => ["sqooptest", "yzjt"]  
  8. hbase(main):027:0> scan 'sqooptest'  
  9. ROW                                           COLUMN+CELL  
  10.  1_\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0       column=stuInfo:address, timestamp=1421668051376value=\xE4\xBA\x94\xE5\x8F\xB0\xE5\xB1\xB1  
  11.  1_\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0       column=stuInfo:school, timestamp=1421668051376value=\xE5\xAE\x89\xE5\xBE\xBD\xE5\xA4\xA7\xE5\xAD\xA6  
  12.  2_\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90       column=stuInfo:address, timestamp=1421668046873value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC  
  13.  2_\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90       column=stuInfo:school, timestamp=1421668046873value=\xE5\x8D\x97\xE4\xBA\xAC\xE5\xA4\xA7\xE5\xAD\xA6  
  14.  3_\xE6\x9D\x8E\xE5\x9B\x9B                   column=stuInfo:address, timestamp=1421668051471value=\xE6\xB1\x9F\xE8\x8B\x8F\xE8\x8B\x8F\xE5\xB7\x9E  
  15.  3_\xE6\x9D\x8E\xE5\x9B\x9B                   column=stuInfo:school, timestamp=1421668051471value=\xE8\x8B\x8F\xE5\xB7\x9E\xE5\xA4\xA7\xE5\xAD\xA6  
  16.  4_\xE7\x8E\x8B\xE6\xB5\xB7                   column=stuInfo:address, timestamp=1421668058375value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC  
  17.  4_\xE7\x8E\x8B\xE6\xB5\xB7                   column=stuInfo:school, timestamp=1421668058375value=null  
  18.  5_\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90       column=stuInfo:address, timestamp=1421668063445value=null  
  19.  5_\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90       column=stuInfo:school, timestamp=1421668063445value=\xE6\xB8\x85\xE5\x8

你可能感兴趣的:(Hadoop)