sqoop學習2(資料匯入與匯出命令)

NO IMAGE
目錄

最近學習了下這個導資料的工具,但是在export命令這裡卡住了,暫時排不了錯誤。先記錄學習的這一點吧

sqoop是什麼

sqoop(sql-on-hadoop):是用來實現結構型資料(如關係型資料庫)和hadoop之間進行資料遷移的工具。它充分利用了mapreduce的並行特點以及批處理的方式加快資料的傳輸,同時也藉助mapreduce實現了容錯。

sqoop架構

1)sqoop目前有兩個版本sqoop1(1.4.x)和sqoop2(1.99.x),這裡安裝的是sqoop1版本

2)sqoop1是由client端直接接入hadoop,任務通過解析生成對應的mapreduce執行

3)sqoop1架構圖

4)匯入(import)與匯出(export)
匯入:往hdfs上導資料
匯出:從hdfs上匯出去

匯入流程:
1)讀取要匯入資料的表結構
2)讀取引數,設定好job
3)呼叫mapreduce執行任務
—-a 首先要對資料進行切分
—-b 寫入範圍,以便讀取
—-c 讀取範圍引數(第二步中設定的引數)
—-d 建立RecordReader並從資料庫中讀取資料
—-e 建立map
—-f 執行map

匯出流程:匯入過程的逆向過程

sqoop常用命令

命令初步認識

[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test'
註釋:
sqoop:表示sqoop命令
import:表示匯入
--connect jdbc:mysql://spark1:3306 :表示告訴jdbc,連線mysql的url。這個是在hive的hive-site.xml中設定的
wujiadong:表示mysql資料庫中的一個資料庫  
--username root: 連線mysql的使用者名稱
--password xxx: 連線mysql的密碼,我這裡省略了
--table stud_info: 從mysql要匯出資料的表名稱
--fields-terminated-by '\t': 指定輸出檔案中的行的欄位分隔符,我這沒有寫
-m 1 表示複製過程使用1個map作業,如果不寫的話預設是4個map
注:因我安裝mysql時沒有設定密碼,所以沒有加密碼項

我導資料時候有時遇到匯入不成功,報10020埠連線不上,試試在namenode上執行命令:
mr-jobhistory-daemon.sh start historyserver 之後再去導資料

1)version:顯示sqoop版本

檢視安裝的sqoop版本
[[email protected] ~]# sqoop version

2)help:檢視sqoop幫助資訊

[[email protected] ~]# sqoop help

3)list-databases:列印出關聯式資料庫所有的資料庫名

顯示出mysql資料庫下所有資料庫名
[[email protected] sqoop]# sqoop list-databases --connect jdbc:mysql://spark1:3306 --username root

資料庫連線引數

–connect <jdbc-uri> :Jdbc連線url,示例如--connect jdbc:mysql://spark1:3306
–connection-manager :指定要使用的連線管理類
–driver :指定jdbc要使用的驅動類
-P :從控制檯讀取輸入的密碼,注意P是大寫的
–password :Jdbc url中的資料庫連線密碼
–username :Jdbc url中的資料庫連線使用者名稱
–verbose :在控制檯列印出詳細執行資訊
–connection-param-file :一個記錄著資料庫連線引數的檔案

4)list-tables:列印出關聯式資料庫某一資料庫的所有表名

顯示mysql資料庫中wujiadong這個資料庫中所有的表名
[[email protected] ~]# sqoop list-tables --connect jdbc:mysql://spark1:3306/wujiadong -username root

5)import:將資料庫表的資料匯入到hive中,如果在hive中沒有對應的表,則自動生成與資料庫表名相同的表

–append : 資料追加到HDFS上一個已存在的資料集上
–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的記錄.注意查詢的欄位中不能有資料型別為字串的欄位,否則會報錯:java.sql.SQLException: Invalid value for
–columns : 指定要匯入的欄位值,格式如:–columns id,username
–query,-e<statement> : 從查詢結果中匯入資料,該引數使用時必須指定–target-dir、–hive-table,在查詢語句中一定要有where條件且在where條件中需要包含$CONDITIONS,示例:–query ‘select * from person where $CONDITIONS ‘ –target-dir /user/hive/warehouse/person –hive-table person
–split-by<column-name> :表的列名,用來切分工作單元,一般後面跟主鍵ID
–table <table-name> :關聯式資料庫表名,資料從該表中獲取
–target-dir <dir> :指定hdfs路徑

增量匯入

–check-column (col):用來作為判斷的列名,如id
–incremental (mode):append:追加,比如對大於last-value指定的值之後的記錄進行追加匯入。lastmodified:最後的修改時間,追加last-value指定的日期之後的記錄
–last-value (value):指定自從上次匯入後列的最大值(大於該指定的值),也可以自己設定某一值

資料從mysql匯入到hdfs

例項1:將mysql中wujiadong資料庫中的表stud_info表中的資料匯入到hdfs(–target-dir)

[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test'   如果這個目錄存在會報錯。
[[email protected] ~]# hadoop fs -lsr /user/sqoop_test 匯入成功後檢視
[[email protected] ~]# hadoop fs -cat /user/sqoop_test/part* 可以直接檢視匯入的資料。這裡出現了中文亂碼暫時不管,後面解決
如果執行之後不成功可以試試在命令後加上-m 1 只啟動一個map

例項2:在1的基礎上繼續往這個檔案中匯入資料(append)

[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --append --target-dir 'hdfs://spark1:9000/user/sqoop_test'  可以看到比原來的多瞭解一個檔案

例項3:在1基礎上刪除已存在檔案並匯入資料(–delete-target-dir)

[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test'   --delete-target-dir

例項4:增量匯入資料到hdfs

例項5:指定條件匯入(注意不能含中文)

[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test' -m 1 --where "stud_gend='M'" --append 
模糊查詢
[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test' -m 1 --where "stud_code like '%201510%'" --append 

例項6:啟用壓縮

[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test' -m 1 --where "stud_gend='M'" --append -z
預設Gzip壓縮;其它壓縮方式用--compression-codec xxx
使用text命令檢視壓縮檔案
[[email protected] ~]# hadoop fs -text   /user/sqoop_test/part-m-00001.gz

例項7:匯入空值(NULL)處理

字串型別
[[email protected] ~]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test' -m 1 --where "stud_gend='M'" --append --null-string "**"
非字串型別
[[email protected] hive_test]# sqoop import --connect jdbc:mysql://spark1:3306/wujiadong --username root --table stud_info --target-dir 'hdfs://spark1:9000/user/sqoop_test' -m 1 --where "stud_gend='M'" --append --null-string "**" --null-non-string "##"

例項8:sql匯入


資料從mysql匯入到hive

--hive-home <dir>:直接指定hive安裝目錄
--hive-import:使用預設分隔符匯入hive
--hive-overwrite:覆蓋掉在hive表中已經存在的資料
--create-hive-table:生成與關聯式資料庫表的表結構對應的HIVE表。如果表不存在,則建立,如果存在,報錯
--hive-table <table-name>:匯入到hive指定的表,可以建立新表
--hive-drop-import-delims:入資料到hive時,刪除字串欄位中的 \n, \r, and \01 
--hive-delims-replacement:用自定義的字串替換掉資料中的\n, \r, and \01等字元
--hive-partition-key:建立分割槽,後面直接跟分割槽名即可,建立完畢後,通過describe 表名可以看到分割槽名,預設為string型
--hive-partition-value <v>:該值是在匯入資料到hive中時,與–hive-partition-key設定的key對應的value值
--map-column-hive <map>:生成hive表時,可以更改生成欄位的資料型別,格式如:–map-column-hive LAST_ACCESS_TIME=string
--fields-terminated-by:指定分隔符(hive預設的分隔符是/u0001)

例項1 :將mysql資料庫wujiadong1中的stud_info表中資料匯入到hive總的stud_info1表中(該表未先建立)

[[email protected] ~]# sqoop import --connect jdbc:mysql://192.168.220.144:3306/wujiadong1 --username root -table stud_info --hive-import -m 1 --hive-table stud_info1
沒有指定匯入到哪個資料庫,預設匯入到default資料庫中

例項2:將mysql資料庫wujiadong1中的stud_info表中資料匯入到hive的sqoop_test資料庫的stud_info表中(該表未先建立)

在hive中建立資料庫sqoop_test
hive> create database sqoop_test;
使用sqoop建立表並匯入表
[[email protected] ~]# sqoop import --connect jdbc:mysql://192.168.220.144:3306/wujiadong1 --username root --table stud_info --hive-import -m 1 --hive-table sqoop_test.stud_info  #指定匯入到那個資料庫中
進入hive檢視是否匯入成功
hive> use sqoop_test;
hive> show tables;
hive> desc stud_info;
hive> select * from stud_info;

例項3:在2的基礎上用–hive-overwrite覆蓋匯入

[[email protected] ~]# sqoop import --connect jdbc:mysql://192.168.220.144:3306/wujiadong1 --username root --table stud_info --hive-import -m 1 --hive-table sqoop_test.stud_info --hive-overwrite
只覆蓋資料,不覆蓋表結構

例項4:使用非預設分隔符“,”分隔hive表欄位

[[email protected] ~]# sqoop import --connect jdbc:mysql://192.168.220.144:3306/wujiadong1 --username root --table stud_info --hive-import -m 1 --hive-table sqoop_test.stud_info1 --fields-terminated-by "," 
hive> show create table stud_info1; 檢視詳細資訊

例項5:增量匯入


資料從mysql匯入到hbase(學完hbase再學)

檔案輸出引數

–enclosed-by <char> : 給欄位值前後加上指定的字元,比如雙引號,示例:–enclosed-by ‘\”‘,顯示例子:”3″,”jimsss”
–fields-terminated-by <char> : 設定每個欄位是以什麼符號作為結束的,預設是逗號,也可以改為其它符號
–lines-terminated-by <char> : 設定每條記錄行之間的分隔符,預設是換行,但也可以設定自己所需要的字串
–delete-target-dir : 每次執行匯入命令前,若有就先刪除target-dir指定的目錄

6)export:從hdfs中匯出資料到關聯式資料庫中

--validate <class-name>:啟用資料副本驗證功能,僅支援單表拷貝,可以指定驗證使用的實現類
--validation-threshold <class-name>:指定驗證門限所使用的類
--direct:使用直接匯出模式(優化速度)
--export-dir <dir>:匯出過程中HDFS源路徑
--m,--num-mappers <n>:使用n個map任務並行匯出
--table <table-name>:匯出的目的表名稱
--update-key <col-name>:更新參考的列名稱,多個列名使用逗號分隔
--input-null-string <null-string>:使用指定字串,替換字串型別值為null的列
--input-null-non-string <null-string>:使用指定字串,替換非字串型別值為null的列
--staging-table <staging-table-name>:在資料匯出到資料庫之前,資料臨時存放的表名稱

參考資料1:
sqoop中文手冊

參考資料2:
Sqoop匯入關聯式資料庫到Hive

參考資料3:
sqoop安裝文件

參考資料4:
Sqoop之匯入匯出操作