sqoop export (HDFS 到MySQL)
- 登錄客戶端所在節點。
- 執行如下命令初始化環境變量。
source /opt/client/bigdata_env
- 使用sqoop命令操作sqoop客戶端。
sqoop export --connect jdbc:mysql://10.100.231.134:3306/test --username root --password xxxxxx --table component13 -export-dir hdfs://hacluster/user/hive/warehouse/component_test3 --fields-terminated-by ',' -m 1
詳見下表:參數說明
| 參數 | 說明 |
|---|---|
| -direct | 快速模式,利用了數據庫的導入工具,如MySQL的mysqlimport,可以比jdbc連接的方式更為高效的將數據導入到關系數據庫中。 |
| -export-dir | 存放數據的HDFS的源目錄。 |
| -m或-num-mappers | 啟動n個map來并行導入數據,默認是4個,該值請勿高于集群的最大Map數。 |
| -table | 要導入的目的關系數據庫表。 |
| -update-key | 后面接條件列名,通過該參數可以將關系數據庫中已經存在的數據進行更新操作,類似于關系數據庫中的update操作。 |
| -update-mode | 更新模式,有兩個值updateonly和默認的allowinsert,該參數只能在關系數據表里不存在要導入的記錄時才能使用,比如要導入的hdfs中有一條id=1的記錄,如果在表里已經有一條記錄id=2,那么更新會失敗。 |
| -input-null-string | 可選參數,如果沒有指定,則字符串null將被使用。 |
| -input-null-non-string | 可選參數,如果沒有指定,則字符串null將被使用。 |
| -staging-table | 創建一個與導入目標表同樣數據結構的表,將所有數據先存放在該表中,然后由該表通過一次事務將結果寫入到目標表中。 該參數是用來保證在數據導入關系數據庫表的過程中的事務安全性,因為在導入的過程中可能會有多個事務,那么一個事務失敗會影響到其它事務,比如導入的數據會出現錯誤或出現重復的記錄等等情況,那么通過該參數可以避免這種情況。 |
| -clear-staging-table | 如果該staging-table非空,則通過該參數可以在運行導入前清除staging-table里的數據。 |
sqoop import(MySQL到 Hive表)
- 登錄客戶端所在節點。
- 執行如下命令初始化環境變量。
source /opt/client/bigdata_env
- 使用sqoop命令操作sqoop客戶端。
sqoop import --connect jdbc:mysql://10.100.231.134:3306/test --username root --password xxxxxx --table component --hive-import --hive-table component_test2 --delete-target-dir --fields-terminated-by"," -m 1 --as-textfile
詳見下表:參數說明
| 參數 | 說明 |
|---|---|
| -append | 將數據追加到hdfs中已經存在的dataset中。使用該參數,sqoop將把數據先導入到一個臨時目錄中,然后重新給文件命名到一個正式的目錄中,以避免和該目錄中已存在的文件重名。 |
| -as-avrodatafile | 將數據導入到一個Avro數據文件中。 |
| -as-sequencefile | 將數據導入到一個sequence文件中。 |
| -as-textfile | 將數據導入到一個普通文本文件中,生成該文本文件后,可以在hive中通過sql語句查詢出結果。 |
| -boundary-query | 邊界查詢,在導入前先通過SQL查詢得到一個結果集,然后導入的數據就是該結果集內的數據,格式如:-boundary-query 'select id,creationdate from person where id = 3' ,表示導入的數據為id=3的記錄,或者select min(), max() from 。 注意:查詢的字段中不能有數據類型為字符串的字段,否則會報錯:java.sql.SQLException: Invalid value for getLong()。 |
| -columns<col,col,col | 指定要導入的字段值,格式如:-columns id,username |
| -direct | 快速模式,利用了數據庫的導入工具,如MySQL的mysqlimport,可以比jdbc連接的方式更為高效的將數據導入到關系數據庫中。 |
| -direct-split-size | 在使用上面direct直接導入的基礎上,對導入的流按字節數分塊,特別是使用直連模式從PostgreSQL導入數據時,可以將一個到達設定大小的文件分為幾個獨立的文件。 |
| -inline-lob-limit | 設定大對象數據類型的最大值。 |
| -m或-num-mappers | 啟動n個map來并行導入數據,默認是4個,該值請勿高于集群的最大Map數。 |
| -query,-e | 從查詢結果中導入數據,該參數使用時必須指定-target-dir、-hive-table,在查詢語句中一定要有where條件且在where條件中需要包含CONDITIONS。 示例:-query 'select * from person whereCONDITIONS ' -target-dir /user/hive/warehouse/person -hive-table person |
| -split-by | 表的列名,用來切分工作單元,一般后面跟主鍵ID。 |
| -table | 關系數據庫表名,數據從該表中獲取。 |
| -target-dir | 指定hdfs路徑。 |
| -warehouse-dir | 與-target-dir不能同時使用,指定數據導入的存放目錄,適用于導入hdfs,不適合導入hive目錄。 |
| -where | 從關系數據庫導入數據時的查詢條件,示例:-where 'id = 2' |
| -z,-compress | 壓縮參數,默認數據不壓縮,通過該參數可以使用gzip壓縮算法對數據進行壓縮,適用于SequenceFile,text文本文件,和Avro文件。 |
| –compression-codec | Hadoop壓縮編碼,默認為gzip。 |
| –null-string | 替換null字符串,如果沒有指定,則字符串null將被使用。 |
| –null-non-string | 替換非String的null字符串,如果沒有指定,則字符串null將被使用。 |
| -check-column (col) | 增量導入參數,用來作為判斷的列名,如id。 |
| -incremental (mode) append 或lastmodified | 增量導入參數。 append:追加,比如對大于last-value指定的值之后的記錄進行追加導入。 lastmodified:最后的修改時間,追加last-value指定的日期之后的記錄。 |
| -last-value (value) | 增量導入參數,指定自從上次導入后列的最大值(大于該指定的值),也可以自己設定某一值。 |
Sqoop使用樣例
-
sqoop import(MySQL到HDFS)
sqoop import --connect jdbc:mysql://10.100.231.134:3306/test --username root --password xxx --query 'SELECT * FROM component where $CONDITIONS and component_id ="MRS 1.0_002"' --target-dir /tmp/component_test --delete-target-dir --fields-terminated-by "," -m 1 --as-textfile
-
sqoop import(MySQL到obs)
sqoop import --connect jdbc:mysql://10.100.231.134:3306/test --username root --password xxx --table component --target-dir obs://obs-file-bucket/xx --delete-target-dir --fields-terminated-by "," -m 1 --as-textfile
-
sqoop import(MySQL到Hive外obs表)
sqoop import --connect jdbc:mysql://10.100.231.134:3306/test --username root --password xxx --table component --hive-import --hive-table component_test01 --fields-terminated-by "," -m 1 --as-textfile
-
sqoop export (obs到MySQL)
sqoop export --connect jdbc:mysql://10.100.231.134:3306/test --username root --password xxx --table component14 -export-dir obs://obs-file-bucket/xx/part-m-00000 --fields-terminated-by ',' -m 1