用到的表昔善,表名t00_test
全量導(dǎo)入
將sqlserver表導(dǎo)入hdfs:
直接導(dǎo)出全表
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --table t00_test --fields-terminated-by '\t' -m 1
導(dǎo)出指定列
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --table t00_test --columns 'v00,v01' --where 'v01>1' --fields-terminated-by '\t' -m 1
#? --columns <列名>? ?指定列? ? ? --where '條件'? 指定條件
SQL語(yǔ)句導(dǎo)出指定列
(有條件)
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --target-dir 'hdfs://nameservice/user/root/t00_test1' --query "select v00,v01 from t00_test where v01<50 and \$CONDITIONS" --fields-terminated-by '\t' -m 1
(無條件)
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --target-dir 'hdfs://nameservice/user/root/t00_test1' --query "select v00,v01 from t00_test where \$CONDITIONS" --fields-terminated-by '\t' -m 1
注意:
(1)SQL語(yǔ)句必須要用雙引號(hào),其他引號(hào)可單可雙(2)必須制定目標(biāo)文件的位置,--target-dir HDFS目標(biāo)目錄,目錄如果設(shè)定在本地娜氏,則可能會(huì)提示權(quán)限不足導(dǎo)入失敗抬探。(3)用sql選擇導(dǎo)入則必須加入where \$CONDITIONS(4)SQL導(dǎo)入就不能再加--table tablename 語(yǔ)句了
將MySQL表導(dǎo)入hdfs:
其他的跟SqlServer一樣,只是數(shù)據(jù)庫(kù)這里要稍作一下改變
sqoop import --connect 'jdbc:mysql://192.168.XXX.XXX:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false'?--username aaa --password 123?--table t00_test --fields-terminated-by '\t' -m 1
這里為什么數(shù)據(jù)庫(kù)信息后面要加useUnicode=true&characterEncoding=utf-8&useSSL=false荞膘,不然會(huì)有如下錯(cuò)誤提示:
WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
補(bǔ)充:
-m 后面的數(shù)字表示mapper任務(wù)數(shù),如果設(shè)為大于1的數(shù)玉工,即表示導(dǎo)入方式為并發(fā)導(dǎo)入羽资,這時(shí)我們必須同時(shí)指定 - -split-by 參數(shù)指定根據(jù)哪一列來實(shí)現(xiàn)哈希分片,從而將不同分片的數(shù)據(jù)分發(fā)到不同 map 任務(wù)上去跑遵班,避免數(shù)據(jù)傾斜屠升。
查看導(dǎo)入成功后的HDFS對(duì)應(yīng)目錄上的文件(此HDFS目錄事先不需要自己建立,Sqoop會(huì)在導(dǎo)入的過程中自行建立狭郑,若是不寫--target-dir 則默認(rèn)是hdfs上的user/username/tablename 路徑):
查看hdfs里的文件:hadoop fs -ls hdfs://nameservice/user/root/t00_test
刪除hdfs里面的文件:hadoop fs -rmr hdfs://nameservice/user/root/t00_test
查看導(dǎo)入表的數(shù)據(jù):hadoop fs -cat hdfs://nameservice/user/root/t00_test/part-m-00000
增量導(dǎo)入
將sqlserver表導(dǎo)入hdfs:
#? -check-column? #指定檢索列腹暖、-last-value? #從該值所在行開始導(dǎo)入、-incremental? #指定導(dǎo)入模式
append模式:基于遞增列的增量導(dǎo)入(將遞增列值大于閾值的所有數(shù)據(jù)增量導(dǎo)入)翰萨,只對(duì)數(shù)據(jù)進(jìn)行附加脏答,不支持更改
lastmodified模式:基于時(shí)間列的增量導(dǎo)入(將時(shí)間列大于等于閾值的所有數(shù)據(jù)增量導(dǎo)入),適用于對(duì)源數(shù)據(jù)進(jìn)行更改,對(duì)于變動(dòng)數(shù)據(jù)收集殖告,必須記錄變動(dòng)時(shí)間
Append方式
增量導(dǎo)入所有列:
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --table t00_test --check-column v00 --last-value '2019-03-6' --incremental append--fields-terminated-by '\t' -m 1
增量導(dǎo)入指定列:
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --table t00_test --check-column v00 --last-value '2019-03-17' --incremental? append--columns 'v00,v01' --where 'v01>1' --fields-terminated-by '\t' -m 1
SQL語(yǔ)句增量導(dǎo)入指定列:
(有條件)
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --check-column v00 --last-value '2019-03-17' --incremental? append--target-dir 'hdfs://nameservice/user/root/t00_test1' --query "select v00,v01 from t00_test where v01<50 and \$CONDITIONS" --fields-terminated-by '\t' -m 1
(無條件)
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --target-dir 'hdfs://nameservice/user/root/t00_test1' --query "select v00,v01 from t00_test where \$CONDITIONS" --fields-terminated-by '\t' -m 1
lastmodified模式
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --table t00_test --check-column v00 --last-value '2019-03-17' --incremental lastmodified --merge-key v00--fields-terminated-by '\t' -m 1
sqoop import --connect 'jdbc:sqlserver://192.168.XXX.XXX:1433;database=Data00' --username aaa --password 123 --table t00_copy1 --check-column occur --last-value '2015-09-05 13:35:00' --incremental lastmodified --merge-key occur--columns 'occur,v00,v01' --fields-terminated-by '\t' -m 1
特別的:
如果last-value指定的值不在表中,則會(huì)對(duì)這個(gè)值進(jìn)行比較羡洁,導(dǎo)出比這個(gè)值大的部分焚廊,比如執(zhí)行--last-value '2019-03-07'
重要Tip:
生產(chǎn)環(huán)境中,為了防止主庫(kù)被Sqoop抽崩诽里,我們一般從備庫(kù)中抽取數(shù)據(jù)谤狡。
一般RDBMS的導(dǎo)出速度控制在60~80MB/s墓懂,每個(gè) map 任務(wù)的處理速度5~10MB/s 估算,即 -m 參數(shù)一般設(shè)置4~8捕仔,表示啟動(dòng) 4~8 個(gè)map 任務(wù)并發(fā)抽取榜跌。