赤峰建設(shè)銀行網(wǎng)站域名注冊網(wǎng)站哪個好
一、bg
可以在關(guān)系型數(shù)據(jù)庫和hdfs、hive、hbase之間導(dǎo)數(shù)
導(dǎo)入:從RDBMS到hdfs、hive、hbase
導(dǎo)出:相反
sqoop1 和sqoop2 (1.99.x)不兼容,sqoop2 并沒有生產(chǎn)的穩(wěn)定版本,
Sqoop1 import原理(導(dǎo)入)
從傳統(tǒng)數(shù)據(jù)庫獲取元數(shù)據(jù)信息(schema、table、field、field type),把導(dǎo)入功能轉(zhuǎn)換為只有Map的Mapreduce作業(yè),在Mapreduce中有很多map,每個map讀取一片數(shù)據(jù),進而并行的完成數(shù)據(jù)的拷貝
Sqoop1 export原理(導(dǎo)出):
獲取導(dǎo)出表的schema、metahdfs信息,和Hadoop中的字段match;多個map only作業(yè)同時進行,完成hdfs中數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫
主要是對mapreduce自帶的inputformat和outputformat進行了定制
二、下安驗配
依賴java和hadoop
三、sqoop使用
1 常用命令
列出數(shù)據(jù)庫的databases
2 導(dǎo)入
–delete-target-dir :導(dǎo)入到hdfs前,是否刪除目錄(否則無法覆蓋),在生產(chǎn)上不用,手動刪
全部導(dǎo)入
查詢導(dǎo)入
https://blog.csdn.net/u011250186/article/details/119280478
$CONDITIONS:query設(shè)置sql來指定查詢條件,并且還需在sql中添加$CONDITIONS,來實現(xiàn)并行運行mr的功能
- $CONDITIONS是個linux變量,用來給不同的map指定查詢范圍
- $CONDITIONS,在查詢導(dǎo)入的時候必須加,用來保證兩邊的數(shù)據(jù)順序一致。即使只有一個map
- 不加會報錯
- 雙引號包括的查詢sql中,$CONDITIONS要轉(zhuǎn)義
- 如果是多個m,需使用–split-by來區(qū)分?jǐn)?shù)據(jù),$CONDITIONS替換查詢范圍,
列導(dǎo)入
關(guān)鍵字導(dǎo)入
通過表和列的正則來選定導(dǎo)入的列
3 并行度
如果-m>1,會自動識別主鍵并按主鍵拆分,如果主鍵不均勻,建議執(zhí)行拆分列
4 note
‘\N’:單引號’ '原樣顯示里邊的內(nèi)容=>\N ,sqoop的底層是java代碼,java中\(zhòng)會轉(zhuǎn)義為\,即最后會顯示為\N。
Hive中的Null在底層是以“\N”來存儲,而MySQL中的Null在底層就是Null,為了保證數(shù)據(jù)兩端的一致性。在導(dǎo)出數(shù)據(jù)時采用–input-null-string和–input-null-non-string兩個參數(shù)。導(dǎo)入數(shù)據(jù)時采用–null-string和–null-non-string。
四、面試題
sqoop查詢導(dǎo)入時,如果設(shè)置了并行度,那如何保證寫入到hive的數(shù)據(jù)跟源表的數(shù)據(jù)順序是一樣的。$CONDITIONS是用來干嘛的?
sqoop并行讀取時,需要指定每個mapper讀取的數(shù)據(jù)范圍,保證寫入到目的地時有序,$CONDITIONS是個linux變量,用來根據(jù)分區(qū)列來給每個mapper拼接sql。
默認(rèn)用主鍵,如果主鍵分布不均勻,建議用 --split-by指定分區(qū)列。
如果沒有主鍵也沒有–split-by,會報錯。除非–num-mappers 1 or --autoreset-to-one-mapper 。–autoreset-to-one-mapper用來配合import-all-tables 工具一起使用,以自動處理架構(gòu)中沒有主鍵的表。
–split-limit參數(shù)有什么用
用來限制每個mapper讀取數(shù)據(jù)的大小。如果參數(shù)大小 大于 mapper數(shù)量決定的數(shù)據(jù)大小,那會增加mapper數(shù)量。
如果設(shè)置為0 or negative,則不會生效。