您好,登錄后才能下訂單哦!
Sqoop(發音:skup)
是一款開源的工具,主要用于在Hadoop(Hive)與傳統的數據庫(mysql、postgresql...)間進行數據的傳遞,可以將一個關系型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關系型數據庫中。
進行增量導入是與效率有關的最受關注的問題,因為Sqoop專門是為大數據集設計的。Sqoop支持增量更新,將新記錄添加到最近一次的導出的數據源上,或者指定上次修改的時間戳。
由于Sqoop將數據移入和移出關系型數據庫的能力,其對于Hive—Hadoop生態系統里的著名的類SQL數據倉庫—有專門的支持不足為奇。命令“create-hive-table”可以用來將數據表定義導入到Hive。
簡單的說:sqoop是一款數據遷移工具
工作機制:就是通過內置一些數據導入導出的MR 程序,來為我們的數據遷移需求提供便利
sqoop :內置了一下導入導出數據的mr程序
官方網址:http://sqoop.apache.org/
下載:http://archive.apache.org/dist/sqoop/
sqoop是一個工具,只要在一臺機器上安裝就可以了,要在hadoop環境中運行。
首先在官網上下載sqoop,然后上傳到linux中
解壓
tar -zxvf sqoop(壓縮包) -C /usr/local/apps
然后進入到sqoop中進行配置修改
cd conf/
修改sqoop-env-template.sh
首先,我們要修改sqoop-env-template.sh他的名稱
mv sqoop-env-template.sh sqoop-env.sh
然后我們編輯他
vi sqoop-env.sh
首先配置這個,也就是配置hadoop的安裝目錄
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/local/apps/hadoop-2.6.5
接下來配置mapreduce HOME 也就是hadoop的安裝路徑
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/local/apps/hadoop-2.6.5
接下來配置hbase的安裝目錄
#set the path to where bin/hbase is available
export HBASE_HOME=/usr/local/apps/hbase-0.98.24-hadoop2
配置hive的安裝目錄
#Set the path to where bin/hive is available
export HIVE_HOME=/usr/local/apps/apache-hive-2.1.1-bin
最后配置zookeeper的conf目錄
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/local/apps/zookeeper-3.4.6/conf
保存退出
然后我們在把sqoop配置到我們系統的環境變量里面
vi /etc/profile
在最下面寫
export SQOOP_HOME=/usr/local/apps/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
在PATH里面添加
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SQOOP_HOME/bin
保存退出
別忘了讓系統的環境變量生效一下
source /etc/profile
接下來我們來調用一下sqoop看能不能正常運行
注意:我們所有的安裝包和安裝目錄最好都安裝在root下面,在root下面新建一個安裝目錄apps
要不然系統會提示錯誤
Warning: /usr/local/apps/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
sqoop中最常用的的兩個命令
import Import a table from a database to HDFS (把外部的數據庫中的表導入到hdfs中)
export Export an HDFS directory to a database table(把在hdfs中的表導出到sqoop中)‘
測試sqoop使用(會用就行)
第一類:數據庫中的數據導入到hdfs中
首先要確保hdfs和yarn都啟動起來
start-dfs.sh
start-yarn.sh
接下來我們運行sqoop的命令
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail
他是放在了hdfs中
hadoop fs -ls /
hadoop fs -ls /user
hadoop fs -ls /user/root
hadoop fs -ls /user/root/bbs_detail
在這下面就是我們上傳的數據 他會把我們的上傳的數據基本平均分給幾個map去上傳默認是分給4個map task去做
在沒有指點的情況下他會把我們上傳的數據上傳到/user/root/bbs_detail 是他自己自動生成的
默認情況下的分隔符為 ','
sqoop導入數據到hdfs的高級用法(注意寫命令之間的空格)
第一
指定輸出路徑(--target-dir '/sqoop/td'),指點數據分隔符(--field-terminated-by '\t')
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail --target-dir '/sqoop/td' --fields-terminated-by '\t'
指點map task的數量 -m (控制map task的數量可以控制內存小文件多了,效率就會低,如果表很大的話,我們也要把map task 數量變多)
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail --target-dir '/sqoop/td' --fields-terminated-by '\001'-m 1
(在實際生成中,很好用逗號或者tab建做分隔符的,我們用(\001)不可打印的字符作為分隔符)
增加where條件,注意:條件必須用單引號引起來
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail --where 'id>30' --target-dir '/sqoop/td2' --fields-terminated-by '\001'-m 1
增加query語句(使用\將語句換行 '\'表示轉義回車,因為sqoop語句是要寫在一行里面的,太長了寫不下,我們就用'\'來轉義)
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root \
--query 'SELECT id,order_id,product_id FROM bbs_detail where id > 30 AND $CONDITIONS'
--split-by bbs_detail.id --target-dir '/sqoop/td3'
注意:如果使用--query這個命令的時候,需要注意的是where后面的參數,AND $CONDITIONS 這個參數必須加上(AND $CONDITIONS 表示上面寫的select條件結尾了,這是固定的)
而且存在單引號與雙引號的區別,如果--query后面使用的是雙引號,那么需要在$CONDITIONS前加上\即\$CONDITIONS
如果設置map的數量為1個時即-m 1,不用加上--split-by ${tablename.column},否則需要加上(--split-by bbs_detail.id 表示,告訴map task按照bbs_detail.id去劃分)
我們一般都是把數據導入到hive(數據倉庫)中講SQL語法表達的數據運算邏輯轉換為mapreduce程序在hadoop集群上對海量數據進行分析
從數據庫中導入數據到hive中
sqoop import --hive-import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail
啟動hive
命令為hive
show tables
也可以把數據庫中的數據導入到hbase中
sqoop import --hbase-import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail
第二類:將hdfs上的數據導出到數據庫中
sqoop export --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --export-dir '/sqoop/bak' --table td_bak --columns id,order_id --fields-terminated-by',' -m 2
(baba 表示:庫 --export-dir '/sqoop/bak'表示:導出的數據現在在哪個目錄 --table td_bak 表示:導入的目標的表是哪個表 導入的目標的這個表必須事先存在的(也就是在mysql中要先創建好td_bak這個表),也就是你要先創建好 --columns id,order_id 表示:把哪些字段導入到表中 --fields-terminated-by','表示:文件分隔符為逗號 map task為2)
由于命令太長,我們可以這樣去使用命令:
sqoop export --connect jdbc:mysql://hadoop-server-00:3306/baba \
--username root --password root \
--export-dir '/sqoop/bak' --table td_bak \
--columns id,order_id --fields-terminated-by',' -m 2
注意:以上測試要配置mysql的遠程連接
GRANT ALL PRIVILEGES ON mytest.* TO 'root'@'192.168.0.104' IDENTIFIED BY 'itcast' WITH GRANT OPTION;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON*.*TO'root'@'%'IDENTIFIED BY 'itcast' WITH GRANT OPTION;
設置Mysql遠程訪問
grant all privileges on . to 'root'@'%' identified by '123456' with grant option;
解決Mysql亂碼問題
找一個配置文件,復制到/etc/目錄,命名為my.cnf
(有時候沒有my.cnf)
cp /usr/share/doc/mysql-server-5.1.73/my-medium.cnf /etc/my.cnf
vim my.cnf
在[client]和[mysqld]下面都添加上
default-character-set=utf8
最后按Esc輸入
:wq
保存退出
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。