hadoop匯入資料工具sqoop介紹

被擱淺的魚發表於2015-09-11

Apache sqoop是一個開源的工具,它用於將資料從結構化儲存器抽取到hadoop中,用於進一步的處理,抽取的資料可以被mapreduce程式運用,也可被類似於Hive的工具使用。這篇文章只介紹它具體的使用命令,至於安裝暫且不提大家可以自行百度。

Sqoop命令工具

Shell命令格式

$ sqoop tool-name [tool-arguments]

常見tool-name

  1. Sqoop-list-databases 列出所有資料庫

  2. Sqoop-list-tables列出資料庫下所有表

  3. Sqoop-eval 執行原始的sql指令碼

Sqoop-import

 用於匯入單個表從RDBMS到HDFS表的每一行都代表著一個單獨記錄在HDFS

連線資料庫(RDBMS)

命令格式:

$ Sqoop import --connect JDBC:MySql://192.168.0.230/ --username ‘root’ \
--password ‘root’

  1. --connect 資料庫連線地址

  2. --username 資料庫登陸名

  3. --password 資料庫連線地址

注意:一般不推薦直接使用- -password因為這個選項要輸入資料庫明文密碼,是不安全的 一般推薦另外兩個引數選項:

    • -password-file 用於指定一個密碼檔案。例如:

      • -password-file ${user.home}/.password
  1. –p 從控制檯直接輸入密碼

  2. –Driver 用於手動指定JDBC驅動類(預設為mysql)例如:

    $ Sqoop  import -- Driver com.microsoft.jdbc.sqlserver.sqlserverDriver  \
    

    --connect … …

  3. –validate 啟用驗證的資料複製,只支援單表複製

  4. – validate-threshold 指定要使用的闊值驗證類

篩選資料進行匯入

  1. –colums 選擇特定列進行匯入 –colums “id ,name,age”

  2. –where 選擇符合條件的資料進行匯入 –where “id > 400”

注意:預設情況下sqoop使用了

SELECT min(),max() FROM table-name 的查詢語句 可以使用 –boundary-query 自定義指定。

自由資料匯入介面

  1. --query 使用--query自由格式查詢時,必須指定一個目標目錄在叢集模式(多個map)下,必須指定劃分列:例如

    $ Sqoop import \ --query ‘SELECT A.,B. FROM A JOIN B ON(A.ID=B.ID) WHERE $CONDITIONS \ --Split-by ID --target-dir /user/foo/joinresult

在一個map任務匯入命令如下: $ Sqoop import \ --query ‘SELECT A.,B. FROM A JOIN B ON(A.ID=B.ID) WHERE $CONDITIONS \ -m 1 --target-dir /user/foo/joinresult

注意:自由查詢裡面不能有or語句

Sqoop匯入hbase

  1. --hbase-table 輸入表的每一行將對應hbase中的每一個put語句

  2. --hbase-row-key 指定行健(預設為sqoop的分割鍵)

  3. --column-family 指定列族(必須)

  4. --hbase-create-table 如果匯入時目標表不存在可以用這個命令預設建立

  5. --hbase-bulkload 批量載入

匯入例子:

$sqoop import --connect JDBC:MySql://192.168.0.230:3306/demo \

--table webpage  \

--hbase-table  A  \

--column-family  f  \

--hbase-row-key  id  \

--hbase-create-table  \

--username ‘root’   --password ‘root’

Sqoop-import-all-table

使用此命令的必要條件:

  1. 每個表必須由一個單列主鍵

  2. 必須匯入表的所有列

  3. 不能使用非預設splitting column 也不能使用where 語句

語法

 $sqoop  import-all-tables  (generic-args)  (import-args)

例如:

     $sqoop  import-all-tables  JDBC:MySql://192.168.0.230:3306/demo

Sqoop-export

      此命令用於將HDFS資料匯入到RDBMS表中

語法 $sqoop export (generic-args) (import-args)

       其中 --export-dir , --table或 --call 是必須的

       預設情況下,sqoop-export匯入新的行到表記錄使用 --update --key 可以更新記錄例如:

       $sqoop  export  --table  foo  -- update-key  id  \

        -- export-dir  /path/to/data  -- connect … …

      等同於UPDATE  FOO  SET … … WHERE  id = … …

--update-mode

匯出記錄如果主鍵已經存在則更新不存在則新插入

示例

$sqoop  export  –connect  JDBC:MySql://192.168.0.230:3306/foo   \

 --table bar  -- export-dir  /results/bar_data/   \

 -- validate (可選)

$sqoop  export  –connect  JDBC:MySql://192.168.0.230:3306/foo   \

--call barproc  -- export-dir  /results/bar_data/   

使用選項檔案傳遞引數

  1. --options-files

原來方式:

$sqoop import --connect JDBC:MySql://192.168.0.230:3306/demo \

--username ‘root’ --password ‘root’ --table test

檔案引數模式:

  1. $sqoop import --options-files /user/import.txt --table test

/user/import 檔案內容:

Import --connect jdbc:mysql://localhost/db --username foo \ --password root

                                            **sqoop原理**
sqoop使用java語言編寫,通過一個MapReduce作業從資料庫中匯入一個表,這個MapReduce作業從表中抽取一行行記錄然後將記錄寫入HDFS
sqoop通過使用JDBC來檢查將要匯入的表,檢索出表中所有的列以及列的sql型別(VARCHAR INTEGER等)這些型別將被對映成java資料型別(String int) 在MapReduce應用中將使用這些對應的java資料型別來儲存欄位的值。sqoop的程式碼生成器使用這些資訊來建立對應表的類,用於儲存從表中抽取的記錄。
sqoop啟動的MapReduce作業用到一個InputFormat類,它通過JDBC從資料庫表中讀取部分內容,Hadoop提供的DataDrivenDBInputFormat 能為查詢結果進行劃分傳給指定個數的map任務

查詢會根據一個劃分列進行劃分sqoop會預設會自動選擇一個合適的劃分列(主鍵),該列的最大值和最小值會被讀出與目標任務一起用來確定每個map任務要執行的查詢。

注意:**劃分列**是影響sqoop並行執行效率的重要因素。

相關文章