前言
很早之前用過Sqoop,後來就再也沒有用過,原因是:
Sqoop走的MR,效率顯然不咋地啊
不過,最近新集羣搭建起來後,想把能配的組件都配置起來,然後進行測試,於是就把之前測試過Sqoop的東西,整理了一下
Sqoop簡介
Sqoop(發音:skup)是一款開源的工具,主要用於在Hadoop(Hive)與傳統的數據庫(mysql、postgresql…)間進行數據的傳遞,可以將一個關係型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型數據庫中。
Sqoop2 VS Sqoop1
CDH6.0以後移除了Sqoop2
CDH移除的組件看官網
sqoop2赫然在列,可是爲什麼CDH直接移除了sqoop2呢???
Mysql數據導入Hdfs
- 沒有指定主鍵(即–split-by參數)
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--columns
id,username,password
--table
t_user
--target-dir
hdfs://unisk01:8020/sqoop/test1
-m
1
說明:如果表沒有定義主鍵–split-by
<col>
且未提供主鍵(這裏的主鍵其實就是隨便一個表裏的字段而已),則導入將失敗,除非使用–num-mappers(或-m) 1選項或使用–autoreset-to-one-mapper選項將映射器的數量顯式設置爲1 。該選項 --autoreset-to-one-mapper通常與import-all-tables工具一起使用,以自動處理模式中沒有主鍵的表。
默認情況下,Sqoop作業會並行使用4個map任務來加速導入過程,-m 1則意味着只使用一個map任務,最終也就是生成一個文件
如果要追加往HDFS中的文件寫,需要配置:
--check-column
id
--incremental
append
–check-column :就是指定要給遞增列,其實隨便哪一列都可以,不過不可以不寫,–incremental比如配合其使用,不然報錯:
For an incremental import, the check column must be specified with --check-column.
可以看到,追加數據成功:
1,張三,85,74,91
2,李四,95,90,83
3,王五,85,84,59
4,趙六,75,79,76
5,田七,69,63,98
6,李老八,89,90,83
1,張三,85,74,91
2,李四,95,90,83
3,王五,85,84,59
4,趙六,75,79,76
5,田七,69,63,98
6,李老八,89,90,83
- 指定主鍵的配置
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--columns
id,username,password
--table
t_user
--target-dir
hdfs://node01:8020/sqoop/test1
--split-by
id
-m
2
- 指定輸出數據的格式
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--columns
id,username,password
--table
t_user
--target-dir
hdfs://node01:8020/sqoop/test1
--split-by
id
-m
2
--fields-terminated-by
'\t'
--lines-terminated-by
'\n'
- 通過sql語句輸出數據
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--target-dir
hdfs://node01:8020/sqoop/test1
--split-by
username
-m
5
--fields-terminated-by
','
--lines-terminated-by
'\n'
--query
'SELECT * from t_user WHERE $CONDITIONS'
說明:–query(或-e)不能和–table,–columns共存,通過–query,sqoop可以導入任意sql查詢結果集。
有一個問題就是哪怕後面沒有什麼要寫的條件,也要寫WHERE$CONDITIONS
,不然會報錯:
must contain ‘$CONDITIONS’ in WHERE clause.
Mysql數據導入Hive
import
--connect
jdbc:mysql://192.168.0.199/db_test
--username
root
--password
root
--table
t_user
-m
1
--fields-terminated-by
','
--hive-import
--hive-database
default
--hive-table
t1
--hive-overwrite
--hive-drop-import-delims
說明:不需要事先創建hive表,這個腳本執行完後,會自動創建好表
Hdfs數據導入Mysql
Sqoop Export
導出工具將一組文件從HDFS導出回RDBMS。 目標表必須已經存在於數據庫中。 根據用戶指定的分隔符讀取輸入文件並將其解析爲一組記錄。
默認操作是將它們轉換爲一組將INSERT語句注入數據庫的記錄。 在“更新模式”下,Sqoop將生成UPDATE語句來替換數據庫中的現有記錄,並且在“調用模式”下,Sqoop將爲每條記錄創建一個存儲過程調用。
(1) 先創建一張空表用來接收HDFS的數據:
HDFS數據:
(2) 編寫選項文件
export
--connect
jdbc:mysql://192.168.4.16/test //指定把HDFS數據導入哪個數據
--username
root
--password
123
--columns
id,username,password
--table
t_user //指定導入到哪個表
-m
1
--export-dir
hdfs://mycluster/sqoop/test1/
--fields-terminated-by //必須指定HDFS數據是以什麼分割
','
(3)執行選項文件
(4) 去mysql查看數據
如何運行編輯好的選項文件
sqoop --options-file optionfile
可能遇到的問題
-
Please specify one with --split-by or perform a sequential import with ‘-m 1’.
原因:如果表沒有定義主鍵–split-by 且未提供主鍵(這裏的主鍵其實就是隨便一個表裏的字段而已),
則導入將失敗,除非使用–num-mappers(或-m)
1選項或使用–autoreset-to-one-mapper選項將映射器的數量顯式設置爲1 。
該選項 --autoreset-to-one-mapper通常與import-all-tables工具一起使用,以自動處理模式中沒有主鍵的表。 -
Malformed option in options file(my_options/option1): --fields-terminated-by ‘\t’
原因:
不要寫到一行
應該這樣寫:
–fields-terminated-by
‘\t’ -
ERROR tool.ImportTool: Imported Failed: Wrong FS: hdfs://unisk01:8020/sqoop/test1, expected: hdfs://mycluster
原因:只是增加了
–delete-target-dir
就報瞭如上錯誤
意思是需要指定一個集羣,而不是單個節點
如果非要使用該命令就只能指定集羣名稱了
不然,就手動刪除 -
把oracle數據導入到hdfs後,數據行數增多
原因:oracle中的有些字段中包含換行符,sqoop導入數據的時候出現了換行
解決方法:
trim(replace(replace(replace(cell_name,chr(13),’’),chr(10),’’),’\n’,’’)) cell_name -
把mysql數據導入hive的時候,發現顯示導入成功,但在hive倉庫中沒找到表和數據
原因:自己在一臺搭建過單擊模式的服務器上搭建的sqoop,由於sqoop中配置的hive
也是這個單機的hive,而單機的多用戶的hive表存儲的路徑不一樣,所以找不到。 -
從mysql導入到hive的時候:
import
--connect
jdbc:mysql://192.168.0.199/db_test
--username
root
--password
root
--table
t_user
-m
1
--fields-terminated-by
','
--hive-import
--hive-database
default
--hive-table
t1
--hive-overwrite
--hive-drop-import-delims
使用上面的配置文件沒有任何問題
但是從oracle導入hive的時候就報錯,意思要增加–columns屬性搭配–table,加上就可以了
- 如果hive的配置文件沒有配hive.metastore.warehouse.dir的話,sqoop導入到hive中的數據是找不到表的