sqoop的功能架構(gòu)
sqoop是能夠在hdfs和關(guān)系型數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)量大的數(shù)據(jù)轉(zhuǎn)換工具,底層運(yùn)行的是mapreduce項(xiàng)目,是Apache的頂級(jí)項(xiàng)目劫瞳。
從架構(gòu)圖可以看出呕童,sqoop相當(dāng)于是hadoop中mapreduce的客戶(hù)端,在sqoop client中執(zhí)行命令意蛀,命令會(huì)被解析成轉(zhuǎn)換為mapreduce任務(wù)(一般只涉及map任務(wù)耸别,不會(huì)涉及到reduce任務(wù)),然后打成jar包提交給YARN運(yùn)行县钥。因?yàn)閔ive和hbase的底層還是hdfs秀姐,所以也可以讓關(guān)系型數(shù)據(jù)和hvie、hbase之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換若贮。
sqoop的使用要點(diǎn)
在sqoop的命令行中執(zhí)行命令囊扳,進(jìn)行數(shù)據(jù)的導(dǎo)入和導(dǎo)出。
- 連接關(guān)系型數(shù)據(jù)庫(kù)需要jdbc路徑兜看、用戶(hù)名锥咸、密碼、表名信息细移。
- 數(shù)據(jù)是導(dǎo)入還是導(dǎo)出搏予,是相對(duì)于hadoop中的hdfs來(lái)說(shuō)的,而不是關(guān)系型數(shù)據(jù)庫(kù)弧轧。
- 數(shù)據(jù)不僅可以轉(zhuǎn)換到HDFS中雪侥,還可以直接轉(zhuǎn)換至hive、hbase中精绎。
導(dǎo)入數(shù)據(jù)到HDFS
sqoop執(zhí)行命令時(shí)速缨,首先到關(guān)系型數(shù)據(jù)庫(kù)中獲取表的相關(guān)元數(shù)據(jù),然后啟動(dòng)只包含map的mapreduce任務(wù)并行的導(dǎo)入數(shù)據(jù)代乃。
- mysql中創(chuàng)建的測(cè)試數(shù)據(jù)
create database if not exists sqoop;
use sqoop;
create table if not exists tohdfs;
insert into tohdfs values('1','aa');
insert into tohdfs values('2','bb');
insert into tohdfs values('3','cc');
insert into tohdfs values('4','dd');
-
默認(rèn)情況下導(dǎo)入到HDFS家目錄中
hive5.png
hive6.png
如果沒(méi)有指定數(shù)據(jù)存儲(chǔ)到什么目錄旬牲,默認(rèn)情況下是HDFS的用戶(hù)主目錄仿粹,因?yàn)榇藭r(shí)執(zhí)行命令的是wulei,所以目錄為/user/wulei/原茅。因?yàn)橹簧闪艘粋€(gè)mapper任務(wù)吭历,所以tohdfs目錄下只有一個(gè)文件。同時(shí)可以發(fā)現(xiàn)數(shù)據(jù)轉(zhuǎn)移到HDFS后擂橘,默認(rèn)的列分隔符為"晌区,"。
- 指定目錄通贞、mapper個(gè)數(shù)和分隔符朗若。
bin/sqoop import
--connect jdbc:mysql://bigdata-00:3306/sqoop
--username root
--password 123456
--table tohdfs \
--target-dir /user/wulei/sqoop/input
--num-mappers 3
--fields-terminated-by "\t"
--delete-target-dir
其中--target-dir為指定目錄 --num-mappers 指定mapper的個(gè)數(shù) --fields-terminated-by 指定列分隔符。需要注意的是昌罩,此時(shí)這個(gè)目錄一定不能已經(jīng)存在捡偏,否則會(huì)報(bào)錯(cuò);可以添加--delete-target-dir參數(shù)提前刪除這個(gè)目錄峡迷。
** 數(shù)據(jù)文件會(huì)導(dǎo)入到用戶(hù)家目錄银伟,然后再移動(dòng)到指定的目標(biāo)目錄 **
-
使用--direct快速導(dǎo)入。利用了數(shù)據(jù)庫(kù)的導(dǎo)入工具绘搞,如mysql的mysqlimport彤避,可以比jdbc連接后導(dǎo)入的方式更加高效的導(dǎo)入到HDFS中。
沒(méi)用--direct的時(shí)間:
hive9.png
使用--direct的時(shí)間:
bin/sqoop import
--connect jdbc:mysql://bigdata-00:3306/sqoop
--username root
--password 123456
--table tohdfs
--target-dir /user/wulei/sqoop/input
--num-mappers 3
--fields-terminated-by "\t"
--delete-target-dir
--direct
- 增量導(dǎo)入
--check-column (col) 檢查指定的列夯辖,根據(jù)此列判斷哪些記錄是新數(shù)據(jù)且需要導(dǎo)入的琉预,列不能是字符相關(guān)類(lèi)型
--incremental (mode) 指定增量模式,mode包含兩種方式:append和lastmodified - append: 當(dāng)表中的記錄是以id持續(xù)增加導(dǎo)入新的記錄的時(shí)候蒿褂,可以使 用append模式圆米,--check-column id 用于檢查id
- lastmodified: 表有時(shí)候也會(huì)執(zhí)行更新操作,此時(shí)可以使用lastmodified導(dǎo)入
--last-value (value): 指定某個(gè)值啄栓,將大于該值的檢查列記錄導(dǎo)入娄帖,以確定僅將新的或者更新后的記錄導(dǎo)入新的文件系統(tǒng)
導(dǎo)出數(shù)據(jù)到關(guān)系型數(shù)據(jù)庫(kù)中
bin/sqoop export
--connect jdbc:mysql://bigdata-00:3306/sqoop
--username root
--password 123456
--table tomysql
--num-mappers 1
--input-fields-terminated-by "\t"
--export-dir /user/wulei/sqoop/input/part-m-00000
從MySQL導(dǎo)入數(shù)據(jù)到Hive
** 會(huì)先將mysql中的數(shù)據(jù)存儲(chǔ)到hdfs用戶(hù)目錄下,然后再移動(dòng)到Hive對(duì)應(yīng)的HDFS目錄中**
bin/sqoop import
--connect jdbc:mysql://bigdata-00:3306/sqoop
--username root
--password 123456
--table tohdfs
--num-mappers 1
--fields-terminated-by "\t"
--delete-target-dir
--hive-import
--hive-database tohive_db
--hive-table tohive
從Hive中導(dǎo)出數(shù)據(jù)到MySQL
** 和hdfs導(dǎo)出數(shù)據(jù)到mysql相同,把導(dǎo)出目標(biāo)目錄轉(zhuǎn)換為表路徑 **
bin/sqoop export --connect jdbc:mysql://bigdata-00:3306/sqoop
--username root
--password 123456
--table tomysql
--num-mappers 1
--input-fields-terminated-by "\t"
--export-dir /user/wulei/sqoop/input/