# sqoop help
# sqoop help 命令名
一般用於 Sqoop 與 MySQL 連通測試:html
sqoop list-databases \ --connect jdbc:mysql://hadoop001:3306/ \ --username root \ --password root
sqoop list-tables \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root
示例:導出 MySQL 數據庫中的 help_keyword
表到 HDFS 的 /sqoop
目錄下,若是導入目錄存在則先刪除再導入,使用 3 個 map tasks
並行導入。java
注:help_keyword 是 MySQL 內置的一張字典表,以後的示例均使用這張表。mysql
sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword \ # 待導入的表 --delete-target-dir \ # 目標目錄存在則先刪除 --target-dir /sqoop \ # 導入的目標目錄 --fields-terminated-by '\t' \ # 指定導出數據的分隔符 -m 3 # 指定並行執行的 map tasks 數量
日誌輸出以下,能夠看到輸入數據被平均 split
爲三份,分別由三個 map task
進行處理。數據默認以表的主鍵列做爲拆分依據,若是你的表沒有主鍵,有如下兩種方案:git
-- autoreset-to-one-mapper
參數,表明只啓動一個 map task
,即不併行執行;--split-by <column-name>
指明拆分數據的參考列。# 查看導入後的目錄 hadoop fs -ls -R /sqoop # 查看導入內容 hadoop fs -text /sqoop/part-m-00000
查看 HDFS 導入目錄,能夠看到表中數據被分爲 3 部分進行存儲,這是由指定的並行度決定的。github
sqoop export \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword_from_hdfs \ # 導出數據存儲在 MySQL 的 help_keyword_from_hdf 的表中 --export-dir /sqoop \ --input-fields-terminated-by '\t'\ --m 3
表必須預先建立,建表語句以下:sql
CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ;
Sqoop 導入數據到 Hive 是經過先將數據導入到 HDFS 上的臨時目錄,而後再將數據從 HDFS 上 Load
到 Hive 中,最後將臨時目錄刪除。可使用 target-dir
來指定臨時目錄。shell
sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword \ # 待導入的表 --delete-target-dir \ # 若是臨時目錄存在刪除 --target-dir /sqoop_hive \ # 臨時目錄位置 --hive-database sqoop_test \ # 導入到 Hive 的 sqoop_test 數據庫,數據庫須要預先建立。不指定則默認爲 default 庫 --hive-import \ # 導入到 Hive --hive-overwrite \ # 若是 Hive 表中有數據則覆蓋,這會清除表中原有的數據,而後再寫入 -m 3 # 並行度
導入到 Hive 中的 sqoop_test
數據庫須要預先建立,不指定則默認使用 Hive 中的 default
庫。數據庫
# 查看 hive 中的全部數據庫 hive> SHOW DATABASES; # 建立 sqoop_test 數據庫 hive> CREATE DATABASE sqoop_test;
# 查看 sqoop_test 數據庫的全部表 hive> SHOW TABLES IN sqoop_test; # 查看錶中數據 hive> SELECT * FROM sqoop_test.help_keyword;
若是執行報錯 java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
,則需將 Hive 安裝目錄下 lib
下的 hive-exec-**.jar
放到 sqoop 的 lib
。apache
[root@hadoop001 lib]# ll hive-exec-* -rw-r--r--. 1 1106 4001 19632031 11 月 13 21:45 hive-exec-1.1.0-cdh5.15.2.jar [root@hadoop001 lib]# cp hive-exec-1.1.0-cdh5.15.2.jar ${SQOOP_HOME}/lib
因爲 Hive 的數據是存儲在 HDFS 上的,因此 Hive 導入數據到 MySQL,實際上就是 HDFS 導入數據到 MySQL。app
# 進入對應的數據庫 hive> use sqoop_test; # 查看錶信息 hive> desc formatted help_keyword;
Location
屬性爲其存儲位置:
這裏能夠查看一下這個目錄,文件結構以下:
sqoop export \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword_from_hive \ --export-dir /user/hive/warehouse/sqoop_test.db/help_keyword \ -input-fields-terminated-by '\001' \ # 須要注意的是 hive 中默認的分隔符爲 \001 --m 3
MySQL 中的表須要預先建立:
CREATE TABLE help_keyword_from_hive LIKE help_keyword ;
本小節只講解從 RDBMS 導入數據到 HBase,由於暫時沒有命令可以從 HBase 直接導出數據到 RDBMS。
將 help_keyword
表中數據導入到 HBase 上的 help_keyword_hbase
表中,使用原表的主鍵 help_keyword_id
做爲 RowKey
,原表的全部列都會在 keywordInfo
列族下,目前只支持所有導入到一個列族下,不支持分別指定列族。
sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword \ # 待導入的表 --hbase-table help_keyword_hbase \ # hbase 表名稱,表須要預先建立 --column-family keywordInfo \ # 全部列導入到 keywordInfo 列族下 --hbase-row-key help_keyword_id # 使用原表的 help_keyword_id 做爲 RowKey
導入的 HBase 表須要預先建立:
# 查看全部表 hbase> list # 建立表 hbase> create 'help_keyword_hbase', 'keywordInfo' # 查看錶信息 hbase> desc 'help_keyword_hbase'
使用 scan
查看錶數據:
Sqoop 支持經過 import-all-tables
命令進行全庫導出到 HDFS/Hive,但須要注意有如下兩個限制:
--autoreset-to-one-mapper
,表明只啓動一個 map task
;第二點解釋得比較拗口,這裏列出官方本來的說明:
- You must not intend to use non-default splitting column, nor impose any conditions via a
WHERE
clause.
全庫導出到 HDFS:
sqoop import-all-tables \ --connect jdbc:mysql://hadoop001:3306/數據庫名 \ --username root \ --password root \ --warehouse-dir /sqoop_all \ # 每一個表會單獨導出到一個目錄,須要用此參數指明全部目錄的父目錄 --fields-terminated-by '\t' \ -m 3
全庫導出到 Hive:
sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true \ --connect jdbc:mysql://hadoop001:3306/數據庫名 \ --username root \ --password root \ --hive-database sqoop_test \ # 導出到 Hive 對應的庫 --hive-import \ --hive-overwrite \ -m 3
Sqoop 支持使用 query
參數定義查詢 SQL,從而能夠導出任何想要的結果集。使用示例以下:
sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --query 'select * from help_keyword where $CONDITIONS and help_keyword_id < 50' \ --delete-target-dir \ --target-dir /sqoop_hive \ --hive-database sqoop_test \ # 指定導入目標數據庫 不指定則默認使用 Hive 中的 default 庫 --hive-table filter_help_keyword \ # 指定導入目標表 --split-by help_keyword_id \ # 指定用於 split 的列 --hive-import \ # 導入到 Hive --hive-overwrite \ 、 -m 3
在使用 query
進行數據過濾時,須要注意如下三點:
--hive-table
指明目標表;-m
不爲 1 或者沒有指定 --autoreset-to-one-mapper
,則須要用 --split-by
指明參考列;where
字句必須包含 $CONDITIONS
,這是固定寫法,做用是動態替換。sqoop import \ --connect jdbc:mysql://hadoop001:3306/mysql \ --username root \ --password root \ --table help_keyword \ --target-dir /sqoop_hive \ --hive-database sqoop_test \ --incremental append \ # 指明模式 --check-column help_keyword_id \ # 指明用於增量導入的參考列 --last-value 300 \ # 指定參考列上次導入的最大值 --hive-import \ -m 3
incremental
參數有如下兩個可選的選項:
last-value
的值都會被導入;timestamp
類型,且插入數據時候要在參考列插入當前時間戳,更新數據時也要更新參考列的時間戳,全部時間晚於 last-value
的數據都會被導入。經過上面的解釋咱們能夠看出來,其實 Sqoop 的增量導入並無太多神器的地方,就是依靠維護的參考列來判斷哪些是增量數據。固然咱們也可使用上面介紹的 query
參數來進行手動的增量導出,這樣反而更加靈活。
Sqoop 默認支持數據庫的大多數字段類型,可是某些特殊類型是不支持的。遇到不支持的類型,程序會拋出異常 Hive does not support the SQL type for column xxx
異常,此時能夠經過下面兩個參數進行強制類型轉換:
示例以下,將原先 id
字段強制轉爲 String 類型,value
字段強制轉爲 Integer 類型:
$ sqoop import ... --map-column-java id=String,value=Integer
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南