【概述】
[sqoop]是Apache頂級(jí)項(xiàng)目,主要用來在Hadoop和關(guān)系數(shù)據(jù)庫中傳遞數(shù)據(jù)呜叫。通過sqoop帐要,我們可以方便的將數(shù)據(jù)從關(guān)系數(shù)據(jù)庫導(dǎo)入到HDFS,或者將數(shù)據(jù)從HDFS導(dǎo)出到關(guān)系數(shù)據(jù)庫
【架構(gòu)】
sqoop架構(gòu)非常簡單落塑,其整合了Hive纽疟、Hbase和Oozie,通過map-reduce任務(wù)來傳輸數(shù)據(jù)憾赁,從而提供并發(fā)特性和容錯(cuò)污朽。
sqoop主要通過JDBC和關(guān)系數(shù)據(jù)庫進(jìn)行交互。理論上支持JDBC的database都可以使用sqoop和hdfs進(jìn)行數(shù)據(jù)交互龙考。
【安裝sqoop】
準(zhǔn)備:http://archive.apache.org/dist/sqoop/1.4.4/
1:sqoop1.4.4.tar.gz
2 : mysql-connector-5.1.8.jar (mysql 連接驅(qū)動(dòng))
tar -xzvf sqoop1.4.4.tar.gz
cp -r sqoop1.4.4 /usr/local
//添加驅(qū)動(dòng)到sqoop的lib包
cp mysql-connector-5.1.8.jar /usr/local/sqoop1.4.4/lib
為了方便可以配置sqoop的home
vim /etc/pprofile
export SQOOP_HOME=/usr/local/sqoop1.4.4
export PATH=$SQOOP_HOME/bin:$PATH
鍵入sqoop help進(jìn)行安裝測試蟆肆,我們發(fā)現(xiàn)會(huì)有警告,這是因?yàn)槲覀兊臎]有配置HBASE_HOME和HCAT_HOME晦款,這些修改sqoop的啟動(dòng)腳本炎功,讓其在啟動(dòng)時(shí)不進(jìn)行對(duì)應(yīng)類加載檢查即可,
bin/configure-sqoop文件中把以下內(nèi)容注釋掉就可以了
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HBASE_HOME}" ]; then
# echo "Warning: $HBASE_HOME does not exist! HBase imports will fail."
# echo 'Please set $HBASE_HOME to the root of your HBase installation.'
#fi
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
# echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
# echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi
【注意】
這里我sqoop的安裝在hadoop03這臺(tái)主機(jī)上缓溅,觀察可以發(fā)現(xiàn)上邊sqoop的配置除了sqoop_home的配置并沒有其他相關(guān)的配置蛇损,那么他是如何知道HDFS的數(shù)據(jù)存儲(chǔ)位置。其實(shí)是這樣的坛怪,sqoop是基于hadoop的淤齐,只要本機(jī)上配置的HAOOP_HOME的信息,sqoop就會(huì)找到hadoop_home的位置袜匿,進(jìn)而找到etc下的配置文件更啄,從而就可以找到nodeManger和resourceManager。如果本機(jī)沒有配置HAOOP_HOME沉帮,你可以在sqoop的conf目錄下配置sqoop-site.xml
【操作】
類一:數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)入到HDFS上
1>默認(rèn)上傳
sqoop import --connect jdbc:mysql://192.168.1.121:3307/hisee --username root --password 123 --table hisee_user --columns 'id, account, income, expenses'
2>指定輸出路徑锈死、指定數(shù)據(jù)分隔符
sqoop import --connect jdbc:mysql://192.168.1.121:3307/hisee --username root --password 123 --table hisee_user --target-dir '/sqoop/td' --fields-terminated-by '\t'
3>指定Map數(shù)量 -m
sqoop import --connect jdbc:mysql://192.168.1.121:3307/hisee --username root --password 123 --table hisee_user --target-dir '/sqoop/td1' --fields-terminated-by '\t' -m 2
4>增加where條件, 注意:條件必須用引號(hào)引起來
sqoop import --connect jdbc:mysql://192.168.1.121:3307/hisee --username root --password 123 --table hisee_user --where 'id>3' --target-dir '/sqoop/td2'
5>增加query語句
sqoop import --connect jdbc:mysql://192.168.1.121:3307/hisee --username root --password 123 --query 'SELECT * FROM trade_detail where id > 2 AND $CONDITIONS' --split-by trade_detail.id --target-dir '/sqoop/td3'
注意:如果使用--query這個(gè)命令的時(shí)候贫堰,需要注意的是where后面的參數(shù),AND $CONDITIONS這個(gè)參數(shù)必須加上
而且存在單引號(hào)與雙引號(hào)的區(qū)別待牵,如果--query后面使用的是雙引號(hào)其屏,那么需要在$CONDITIONS前加上\即\$CONDITIONS
如果設(shè)置map數(shù)量為1個(gè)時(shí)即-m 1,不用加上--split-by ${tablename.column}缨该,否則需要加上
類二:將HDFS上的數(shù)據(jù)導(dǎo)出到數(shù)據(jù)庫中(不要忘記指定分隔符)
1>sqoop export --connect jdbc:mysql://192.168.1.121:3307/hisee --username root --password 123 --export-dir '/td3' --table td_bak -m 1 --fields-terminated-by ','
注意:./sqoop的運(yùn)行實(shí)際上就是一個(gè)只有map的mapreduce程序偎行,實(shí)現(xiàn)將數(shù)據(jù)相互傳遞
【配置mysql遠(yuǎn)程連接】
GRANT ALL PRIVILEGES ON itcast.* TO 'root'@'192.168.1.201' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES