1. 程式人生 > >sqoop基本概念安裝測試(2017)

sqoop基本概念安裝測試(2017)

2.0 col sku conf 字段 map comm creat ron

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
保存退出

sqoop基本概念安裝測試(2017)