Sqoop1.4.4將MySQL資料庫表中資料匯入到HBase表中

來源:互聯網
上載者:User

標籤:

問題導讀:

        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編碼的字串值的二進位值。

二、未經處理資料如下

mysql> select * from user;+----+-----------+--------------+--------------+| id | name      | address      | school       |+----+-----------+--------------+--------------+|  1 | 張三丰    | 五台山       | 安徽大學     ||  2 | 黃易某    | 江蘇南京     | 南京大學     ||  3 | 李四      | 江蘇蘇州     | 蘇州大學     ||  4 | 王海      | 江蘇南京     |              ||  5 | 小德子    |              | 清華大學     |+----+-----------+--------------+--------------+5 rows in set (0.00 sec)
     上面id是關鍵字

三、以單關鍵字作為Rowkey匯入

[[email protected] ~]$ 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匯入的。執行報如下錯誤:

15/01/19 19:17:29 INFO mapreduce.Job: Running job: job_1421373857783_002915/01/19 19:17:43 INFO mapreduce.Job: Job job_1421373857783_0029 running in uber mode : false15/01/19 19:17:43 INFO mapreduce.Job:  map 0% reduce 0%15/01/19 19:17:54 INFO mapreduce.Job: Task Id : attempt_1421373857783_0029_m_000001_0, Status : FAILEDError: java.lang.RuntimeException: Could not access HBase table sqooptest        at org.apache.sqoop.hbase.HBasePutProcessor.setConf(HBasePutProcessor.java:122)        at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)        at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)        at org.apache.sqoop.mapreduce.DelegatingOutputFormat$DelegatingRecordWriter.<init>(DelegatingOutputFormat.java:107)        at org.apache.sqoop.mapreduce.DelegatingOutputFormat.getRecordWriter(DelegatingOutputFormat.java:82)        at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.<init>(MapTask.java:623)        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:743)        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)        at java.security.AccessController.doPrivileged(Native Method)        at javax.security.auth.Subject.doAs(Subject.java:415)        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)
      由錯誤記錄檔可知,是由於無法訪問sqooptest表導致,排除串連問題後,查看發現原來是HBase中沒有該表。解決辦法如下:

     1、先在HBase中建立sqooptest表

hbase(main):006:0> create 'sqooptest','stuInfo'0 row(s) in 1.5930 seconds=> Hbase::Table - sqooptesthbase(main):007:0> listTABLEsqooptestyzjt2 row(s) in 0.0290 seconds
       再次執行,查看結果
hbase(main):012:0> scan 'sqooptest'ROW          COLUMN+CELL 1           column=stuInfo:address, timestamp=1421665851147, value=\xE4\xBA\x94\xE5\x8F\xB0\xE5\xB1\xB1 1           column=stuInfo:name, timestamp=1421665851147, value=\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0 1           column=stuInfo:school, timestamp=1421665851147, value=\xE5\xAE\x89\xE5\xBE\xBD\xE5\xA4\xA7\xE5\xAD\xA6 2           column=stuInfo:address, timestamp=1421665846096, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC 2           column=stuInfo:name, timestamp=1421665846096, value=\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90 2           column=stuInfo:school, timestamp=1421665846096, value=\xE5\x8D\x97\xE4\xBA\xAC\xE5\xA4\xA7\xE5\xAD\xA6 3           column=stuInfo:address, timestamp=1421665850852, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE8\x8B\x8F\xE5\xB7\x9E 3           column=stuInfo:name, timestamp=1421665850852, value=\xE6\x9D\x8E\xE5\x9B\x9B 3           column=stuInfo:school, timestamp=1421665850852, value=\xE8\x8B\x8F\xE5\xB7\x9E\xE5\xA4\xA7\xE5\xAD\xA6 4           column=stuInfo:address, timestamp=1421665858288, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC 4           column=stuInfo:name, timestamp=1421665858288, value=\xE7\x8E\x8B\xE6\xB5\xB7 4           column=stuInfo:school, timestamp=1421665858288, value= 5           column=stuInfo:address, timestamp=1421665862608, value= 5           column=stuInfo:name, timestamp=1421665862608, value=\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90 5           column=stuInfo:school, timestamp=1421665862608, value=\xE6\xB8\x85\xE5\x8D\x8E\xE5\xA4\xA7\xE5\xAD\xA65 row(s) in 0.0650 seconds
     2、添加--hbase-create-table參數,使Sqoop在匯入之前先在HBase中建立對應表及列族。

           以sqooptest2表為例示範如下:

[[email protected] ~]$ 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 hbase(main):020:0> scan 'sqooptest2'ROW              COLUMN+CELL 1               column=stuInfo:address, timestamp=1421667190477, value=\xE4\xBA\x94\xE5\x8F\xB0\xE5\xB1\xB1 1               column=stuInfo:name, timestamp=1421667190477, value=\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0 1               column=stuInfo:school, timestamp=1421667190477, value=\xE5\xAE\x89\xE5\xBE\xBD\xE5\xA4\xA7\xE5\xAD\xA6 2               column=stuInfo:address, timestamp=1421667185489, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC 2               column=stuInfo:name, timestamp=1421667185489, value=\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90 2               column=stuInfo:school, timestamp=1421667185489, value=\xE5\x8D\x97\xE4\xBA\xAC\xE5\xA4\xA7\xE5\xAD\xA6 3               column=stuInfo:address, timestamp=1421667190279, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE8\x8B\x8F\xE5\xB7\x9E 3               column=stuInfo:name, timestamp=1421667190279, value=\xE6\x9D\x8E\xE5\x9B\x9B 3               column=stuInfo:school, timestamp=1421667190279, value=\xE8\x8B\x8F\xE5\xB7\x9E\xE5\xA4\xA7\xE5\xAD\xA6 4               column=stuInfo:address, timestamp=1421667198066, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC 4               column=stuInfo:name, timestamp=1421667198066, value=\xE7\x8E\x8B\xE6\xB5\xB7 4               column=stuInfo:school, timestamp=1421667198066, value=null 5               column=stuInfo:address, timestamp=1421667201685, value=null 5               column=stuInfo:name, timestamp=1421667201685, value=\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90 5               column=stuInfo:school, timestamp=1421667201685, value=\xE6\xB8\x85\xE5\x8D\x8E\xE5\xA4\xA7\xE5\xAD\xA65 row(s) in 0.0360 seconds

三、手動指定Rowkey

         禁用、刪除掉之前建立的sqooptest表,示範手動指定Rowkey的情形。我們以id+name組合表示RowKey,如下:

[[email protected] ~]$ 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
        查看結果:

hbase(main):026:0> listTABLEsqooptestyzjt2 row(s) in 0.0430 seconds=> ["sqooptest", "yzjt"]hbase(main):027:0> scan 'sqooptest'ROW                                           COLUMN+CELL 1_\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0       column=stuInfo:address, timestamp=1421668051376, value=\xE4\xBA\x94\xE5\x8F\xB0\xE5\xB1\xB1 1_\xE5\xBC\xA0\xE4\xB8\x89\xE4\xB8\xB0       column=stuInfo:school, timestamp=1421668051376, value=\xE5\xAE\x89\xE5\xBE\xBD\xE5\xA4\xA7\xE5\xAD\xA6 2_\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90       column=stuInfo:address, timestamp=1421668046873, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC 2_\xE9\xBB\x84\xE6\x98\x93\xE6\x9F\x90       column=stuInfo:school, timestamp=1421668046873, value=\xE5\x8D\x97\xE4\xBA\xAC\xE5\xA4\xA7\xE5\xAD\xA6 3_\xE6\x9D\x8E\xE5\x9B\x9B                   column=stuInfo:address, timestamp=1421668051471, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE8\x8B\x8F\xE5\xB7\x9E 3_\xE6\x9D\x8E\xE5\x9B\x9B                   column=stuInfo:school, timestamp=1421668051471, value=\xE8\x8B\x8F\xE5\xB7\x9E\xE5\xA4\xA7\xE5\xAD\xA6 4_\xE7\x8E\x8B\xE6\xB5\xB7                   column=stuInfo:address, timestamp=1421668058375, value=\xE6\xB1\x9F\xE8\x8B\x8F\xE5\x8D\x97\xE4\xBA\xAC 4_\xE7\x8E\x8B\xE6\xB5\xB7                   column=stuInfo:school, timestamp=1421668058375, value=null 5_\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90       column=stuInfo:address, timestamp=1421668063445, value=null 5_\xE5\xB0\x8F\xE5\xBE\xB7\xE5\xAD\x90       column=stuInfo:school, timestamp=1421668063445, value=\xE6\xB8\x85\xE5\x8D\x8E\xE5\xA4\xA7\xE5\xAD\xA6
       由上可知,資料也成功匯入到了HBase中,且Rowkey為id號+name列值的二進位值的組合。Rowkey列之間值是以底線分隔的。


推薦閱讀:
        上一篇:
Sqoop1.4.4將MySQL中資料匯入到Hive表中

Sqoop1.4.4將MySQL資料庫表中資料匯入到HBase表中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.