Hadoop數據傳輸工具sqoop

jopen 10年前發布 | 25K 次閱讀 分布式/云計算/大數據 Sqoop

概述

sqoop是Apache頂級項目,主要用來在Hadoop和關系數據庫中傳遞數據。通過sqoop,我們可以方便的將數據從關系數據庫導入到HDFS,或者將數據從HDFS導出到關系數據庫。
sqoop架構:

Hadoop數據傳輸工具sqoop

sqoop架構非常簡單,其整合了Hive、Hbase和Oozie, 通過map-reduce任務來傳輸數據,從而提供并發特性和容錯
sqoop的進一步發展可以參考: A New Generation of Data Transfer Tools for Hadoop: Sqoop 2

sqoop主要通過JDBC和關系數據庫進行交互。理論上支持JDBC的database都可以使用sqoop和hdfs進行數據交互。
但是,只有一小部分經過sqoop官方測試,如下:

Database            version            --direct support             connect string matches
HSQLDB             1.8.0+             No             jdbc:hsqldb:*//
MySQL             5.0+             Yes            jdbc:mysql://
Oracle             10.2.0+            No             jdbc:oracle:*//
PostgreSQL             8.3+            Yes             (import only)jdbc:postgresql://
較老的版本有可能也被支持,但未經過測試。
出于性能考慮,sqoop提供不同于JDBC的快速存取數據的機制,可以通過--direct使用。

以下基于sqoop-1.4.3

安裝

sqoop安裝使用可以參考 http://www.54chen.com/java-ee/sqoop-mysql-to-hive.html,測試work

工具

sqoop包含一系列的工具,運行sqoop help可以查看相關幫助,
$ ./sqoop help
usage: sqoop COMMAND [ARGS]
Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information
See 'sqoop help COMMAND' for information on a specific command.

使用工具list-tables查看表,如下:
$ ./sqoop list-tables --connect jdbc:mysql://127.0.0.1/test --username root --password 123456 
a
t1

可以使用codegen生成代碼,但不執行map-reduce,如下:
$ ./sqoop codegen --connect jdbc:mysql://127.0.0.1/test --username root --password 123456 --table a --
class-name zxm_sqoop 
......
13/03/21 21:02:01 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-work/compile/29864e3980ab5630b699e8e1e2145369/zxm_sqoop.jar
此處相關代碼和java包可在  /tmp/sqoop-work/compile/29864e3980ab5630b699e8e1e2145369/找到


Import

sqoop 數據導入具有以下特點:
1.支持文本文件(--as-textfile)、avro( --as-avrodatafile)、SequenceFiles(--as-sequencefile)。 RCFILE暫未支持,默認為文本
2.支持數據追加,通過--apend指定
3.支持table列選取(--column),支持數據選取(--where),和--table一起使用
4.支持數據選取,例如讀入多表join后的數據'SELECT a., b. FROM a JOIN b on (a.id == b.id) ‘,不可以和--table同時使用
5.支持map數定制(-m)
6.支持壓縮(--compress)

  1. 支持將關系數據庫中的數據導入到Hive(--hive-import)、HBase(--hbase-table)
       數據導入Hive分三步:1)導入數據到HDFS  2)Hive建表  3)使用“LOAD DATA INPAHT”將數據LOAD到表中
       數據導入HBase分二部:1)導入數據到HDFS 2)調用HBase put操作逐行將數據寫入表


  2. 示例:
    mysql文件內容:
    mysql> select * from a;                          
    +------+--------+
    | key1 | value1 |
    +------+--------+
    |    1 | a1     |
    |    2 | a2     |
    |    3 | a3     |
    |    4 | a4     |
    |    5 | a5     |
    |    6 | a6     |
    |    7 | a7     |
    |    8 | a8     |
    |    9 | a9     |
    +------+--------+

    編寫文件a.conf,內容:
        import

    --append

    -m
    3

    --connect
    jdbc:mysql://127.0.0.1/test

    --username
    root

    --password
    123456

    --table
    a

    --target-dir
    /tmp/a

    --columns
    key1

    --where
    'key1>3' </pre></div> </div> </div> 運行:
    $ ./sqoop --options-file a.conf 

    查看輸出:
    $ hadoop fs -ls /tmp/a/  
    Found 3 items
    -rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00000
    -rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00001
    -rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00002  
    ==》3個文件對應3個mapper
    $ hadoop fs -cat /tmp/a/*
    4
    5
    6
    7
    8
    9


    Export

    sqoop export 能將HDFS上的文件導出到關系數據庫。其工作原理是根據用戶指定的分隔符(字段分隔符:--fields-terminated-by)讀入并解析數據,然后轉換成insert/update語句導入數據到關系數據庫。 </div>
    其具有以下特點:

  3. 支持將數據導出到表(--table)或者調用存儲過程(--call) </div>
  4. 支持insert、update模式
  5. 支持并發控制(-m)
    實例:
    $ hadoop fs -cat /tmp/b/
    1,a
    2,b
    3,c

    $ ./sqoop export --connect jdbc:mysql://127.0.0.1/test --table b  -username root -password 123456 --ex
    port-dir /tmp/b

    mysql> select
    from b;         
    +------+--------+
    | key1 | value1 |
    +------+--------+
    |    1 | a      |
    |    2 | b      |
    |    3 | c      |
    +------+--------+

    出了上述提到的工具外,sqoop還提供了一些有意思的工具,例如sqoop job,有興趣的同學可以研究下

    其它:

  6. 通過使用map-reduce,sqoop提供了良好的并發性和容錯,可以作為 異構數據庫同步工具
  7. Sqoop雖然支持Hive、HBase,但并不完整,某些場景下數據傳輸后的加工不可避免
  8. 大數據傳輸,也許可以使用--direct

    reference:

    Apache sqoop
    Sqoop User Guide
    Apache Sqoop: A Data Transfer Tool for Hadoop
    A New Generation of Data Transfer Tools for Hadoop: Sqoop 2
    Sqoop使用
    大數據異構環境數據同步工具DataX 與Sqoop 之比較
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!