1. 程式人生 > >超詳細的Sqoop介紹及安裝使用文件

超詳細的Sqoop介紹及安裝使用文件

這應該是全網目前最全的Sqoop文件了吧,小廚為大家奉獻整篇內容包括:Sqoop架構、原理、安裝、使用等。

目錄

1  Sqoop簡介

Sqoop可以理解為【SQL–to–Hadoop】,正如名字所示,Sqoop是一個用來將關係型資料庫和Hadoop中的資料進行相互轉移的工具。幫助我們完成資料的遷移和同步。比如,下面兩個潛在的需求:

1、業務資料存放在關係資料庫中,如果資料量達到一定規模後需要對其進行分析或同統計,單純使用關係資料庫可能會成為瓶頸,這時可以將資料從業務資料庫資料匯入(import)到Hadoop平臺進行離線分析。

2、對大規模的資料在Hadoop平臺上進行分析以後,可能需要將結果同步到關係資料庫中作為業務的輔助資料,這時候需要將Hadoop平臺分析後的資料匯出(export)到關係資料庫。

根據Sqoop官網說法,Sqoop2 目前還未開發完,不建議在生產環境使用,所以這裡選的是Sqoop的穩定版 1.4.6。sqoop整體架構如下圖所示:

2  Sqoop原理

2.1 import原理

使用Sqoop可以從關係型資料庫中匯入資料到HDFS上,在這個過程中import操作的輸入是一個數據庫表,Sqoop會逐行讀取記錄到HDFS中。import操作的輸出是包含讀入表的一系列HDFS檔案,import操作是並行的也就是說可以啟動多個map同時讀取資料到HDFS,每一個map對應一個輸出檔案。這些檔案可以是TextFile型別,也可以是Avro型別或者SequenceFile型別。 

Sqoop在import時,需要制定split-by引數。Sqoop根據不同的split-by引數值來進行切分,然後將切分出來的區域分配到不同map中。每個map中再處理資料庫中獲取的一行一行的值,寫入到HDFS中。同時split-by根據不同的引數型別有不同的切分方法,如比較簡單的int型,Sqoop會取最大和最小split-by欄位值,然後根據傳入的num-mappers來確定劃分幾個區域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分別為1000和1,而num-mappers為2的話,則會分成兩個區域(1,500)和(501-100),同時也會分成2個sql給2個map去進行匯入操作,分別為select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最後每個map各自獲取各自SQL中的資料進行匯入工作。
  在import過程中還會生成一個Java類,這個類與輸入的表對應,類名即表名,類變數即表字段。import過程會使用到這個Java類。 

2.2 export原理

在import操作之後,就可以使用這些資料來實驗export過程了。export是將資料從HDFS或者hive匯出到關係型資料庫中。export過程並行的讀取HDFS上的檔案,將每一條內容轉化成一條記錄,然後作為一個新行insert到關係型資料庫表中。 
  除了import和export,Sqoop還包含一些其他的操作。比如可以使用sqoop-list-databases工具查詢資料庫結構,可以使用sqoop-list-tables工具查詢表資訊。還可以使用sqoop-eval工具執行SQL查詢。

3  準備工作:配置資料庫遠端連線

在使用Sqoop之前,要確保關係型資料庫可以允許遠端IP訪問,可以做如下操作:

(1)配置資料庫遠端連線,允許IP地址為192.168.1.102主機以使用者名稱為sqoopuser密碼為sqoopuser的身份訪問資料庫。

mysql>GRANT ALL PRIVILEGES ON mytest.* TO 'root'@'192.168.1.102' IDENTIFIED BY 'sqoopuser' WITH GRANT OPTION;

mysql>FLUSH PRIVILEGES;

(2)配置資料庫遠端連線,允許任意遠端主機以使用者名稱為sqoopuser密碼為sqoopuser的身份訪問資料庫。

mysql>GRANT ALL PRIVILEGES ON *.* TO 'sqoopuser'@'%' IDENTIFIED BY 'sqoopuser' WITH GRANT OPTION;

mysql>FLUSH PRIVILEGES;

至此,可以開始操作sqoop的import/export 命令。

4  安裝Sqoop

一、解壓Sqoop安裝包,解壓即安裝。在/usr/Sqoop資料夾下

 tar -zvxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

二、修改配置檔案,使環境變數生效(在使用Ambari或者CDH時,配置檔案都由平臺自動寫入配置,不需要自行修改。本步操作針對於單機安裝)   

1、cd  /usr/Sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz/conf

2、mv sqoop-env-template.sh sqoop-env.sh

3、如果要往HBASE裡面遷移資料  需要配置 export HBASE_HOME=

還需配置zookeeper   

export ZOOCFGDIR=/usr/zookeeper/zookeeper-3.4.10

4、如果要往HIVE裡面遷移資料    需要配置 export HIVE_HOME=

5、如果要往hdfs裡面遷移資料    需要配置

export HADOOP_COMMON_HOME=/usr/hadoop/hadoop-2.6.5  (hadoop安裝目錄)

export HADOOP_MAPRED_HOME= /usr/hadoop/hadoop-2.6.5  (mapreduce安裝目錄

6、zookeeper的配置檔案  在往HBASE裡遷移資料的時候需要zookeeper

三、在/etc/profile檔案  配置Sqoop的環境變數

1、export SQOOP_HOME=/usr/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha

2、export PATH=$PATH:$SQOOP_HOME/bin

四、使配置檔案生效  source /etc/profile

五、將資料庫連線驅動拷貝到$SQOOP_HOME/lib裡,驅動版本要保證相對較高。

六、測試是否安裝成功,sqoop version

5  Sqoop查詢命令

# sqoop list-databases  --connect jdbc:mysql://192.168.1.7:3306 --username sqoopuser -P

查詢Windows主機的資料庫  -P為了安全,提示使用者輸入密碼

#sqoop list-tables  --connect jdbc:mysql://192.168.1.7:3306/ems --username sqoopuser -password sqoopuser

將指定主機Windows系統下 ems資料庫中所有資料表列出來

6  Sqoop與Hdfs之間匯入匯出

6.1  關係型資料庫匯入到HDFS(以mysql為例)

# sqoop import --connect jdbc:mysql://master:3306/demo_sqoop --username sqoopuser --password sqoopuser --table sqoop_hdfs_test

預設會有四個split 啟動四個mapTask

指定輸出路徑、指定資料分隔符來匯入關係型資料庫中的表

# sqoop import --connect jdbc:mysql://master:3306/demo_sqoop --username sqoopuser --password sqoopuser --table sqoop_hdfs_test  --target-dir '/sqoop/test1' --fields-terminated-by '\001'

指定MapTask數量 -m,指定之後資料結果會出現同一個檔案中,避免檔案分散從而導致不易查詢。

#sqoop import --connect jdbc:mysql://node1:3306/demo_sqoop --username sqoopuser --password sqoopuser --table sqoop_hdfs_test --target-dir '/sqoop/test2' --fields-terminated-by '\001' -m 1

導完之後用以下命令

Hadoop fs -cat /user/root/sqoop_hdfs_test/part-m-00000

指定了輸出目錄、分隔符、mapTask數量生成的hdfs檔案

引數解釋:

--connect jdbc:mysql://node1:3306/demo_sqoop 表示遠端或者本地 Mysql 服務的URI,3306是Mysql預設監聽埠,demo_sqoop要操作的資料庫,若是其他資料庫,如Oracle,只需修改URI和驅動即可

--username sqoopuser表示使用使用者sqoopuser連線Mysql。

--password sqoopuser表示使用使用者sqoopuser的密碼連線Mysql。

--table sqoop_hdfs_test 表示操作的資料表。

--target-dir '/sqoop/test2' 表示匯入指定的資料夾目錄/sqoop/test2

--fields-terminated-by '\001'  使用’\001’去分隔欄位  計算機特殊字元

-m 1  表示啟動一個MapReduce程式。不分割

增加where條件, 注意:條件必須用引號引起來

# sqoop import --connect jdbc:mysql://master:3306/demo_sqoop --username sqoopuser --password sqoopuser --table sqoop_hdfs_test --where 'id>1006' --target-dir '/sqoop/test3' --fields-terminated-by '\001' -m 1

增加query語句(使用 \ 將語句換行)

sqoop import --connect jdbc:mysql://node1:3306/demo_sqoop --username sqoopuser --password sqoopuser \

--query 'SELECT id,name,sex FROM sqoop_hdfs_test where id > 1007 AND $CONDITIONS' --split-by sqoop_hdfs_test.id --target-dir '/sqoop/test

注意:如果使用--query這個命令的時候,需要注意的是where後面的引數,AND $CONDITIONS這個引數必須加上而且存在單引號與雙引號的區別,如果--query後面使用的是雙引號,那麼需要在$CONDITIONS前加上\即\$CONDITIONS

6.2  HDFS匯出到關係型資料庫

#sqoop export --connect jdbc:mysql://master:3306/demo_sqoop  --username sqoopuser --password sqoopuser --export-dir '/sqoopexport/data' --table emloyee --columns id,name --fields-terminated-by ','  -m 2

引數解釋:

--connect jdbc:mysql://node1:3306/demo_sqoop 表示遠端或者本地 Mysql 服務的URI,3306是Mysql預設監聽埠,demo_sqoop要操作的資料庫,若是其他資料庫,如Oracle,只需修改URI和驅動即可

--username sqoopuser表示使用使用者sqoopuser連線Mysql。

--password sqoopuser表示使用使用者sqoopuser的密碼連線Mysql。

--export-dir '/sqoopexport/data' 表示需要匯出HDFS資料的位置

--table myorder  表示接收資料的資料表。

-columns id,name  表示匯入到myorder表裡的id和name欄位,也可不指定。

--fields-terminated-by ','  表示HDFS檔案內容使用','去分隔欄位  

-m 2  表示啟動個MapReduce程式。

可以在關係型資料庫檢視結果,已經匯出成功。

7  Sqoop與HIve匯入匯出

7.1  關係型資料庫匯入Hive

選項引數與上面到如至HDFS幾乎一致,可參考上6節內容。

將mysql中sqoop_hive_test的表資料匯入到Hive中

sqoop import --hive-import --connect jdbc:mysql://master:3306/demo_sqoop --username sqoopuser --password sqoopuser  --table sqoop_hive_test

7.2  Hive匯出到關係型資料庫

sqoop export --connect jdbc:mysql://master:3306/demo_sqoop --username sqoopuser --password sqoopuser --table sqoop_hive_export --export-dir /apps/hive/warehouse/sqoop_export_test2  --input-fields-terminated-by '\001'

注意:sqoop匯出是根據分隔符去分隔欄位值。hive預設的分隔符是‘\001’,sqoop預設的分隔符是',',因此必須指定,否則會報錯。

引數解釋:

--connect jdbc:mysql://node1:3306/demo_sqoop 表示遠端或者本地 Mysql 服務的URI,3306是Mysql預設監聽埠,demo_sqoop是要操作的資料庫,若是其他資料庫,如Oracle,只需修改URI即可。

--username sqoopuser表示使用使用者sqoopuser連線Mysql。

--password sqoopuser表示使用使用者sqoopuser的密碼連線Mysql。

--table sqoop_hive_export 表示操作的要匯入的資料表。

--export-dir /apps/hive/warehouse/sqoop_export_test2    導哪個資料夾下面的檔案

--input-fields-terminated-by '\001'  hive預設的分隔符是‘\001’,sqoop預設的分隔符是','因此需要按照hive的預設去定向指定。

8  Sqoop與Hbase的匯入匯出

8.1  關係型資料庫匯入到Hbase

匯入:

sqoop import --connect jdbc:mysql://master:3306/demo_sqoop --table sqoop_hbase_import --hbase-table sqoop_import_test --column-family perInfo --hbase-row-key id --hbase-create-table --username sqoopuser --password sqoopuser

引數解釋:

--connect jdbc:mysql://node1:3306/demo_sqoop 表示遠端或者本地 Mysql 服務的URI,3306是Mysql預設監聽埠,demo_sqoop是要操作的資料庫,若是其他資料庫,如Oracle,只需修改URI即可

--table  sqoop_hbase_import  表示匯出demo_sqoop資料庫的sqoop_hbase_import表。

--hbase-table  sqoop_import_test  表示在HBase中建立表sqoop_import_test。

--column-family perInfo 表示在表sqoop_import_test中建立列族perInfo。

--hbase-row-key id  表示表sqoop_import_test的row-key是sqoop_hbase_import表的id欄位。
--hbase-create-table 表示在HBase中建立表。
--username sqoopuser表示使用使用者sqoopuser連線Mysql。

8.2 Hbase匯出到關係型資料庫

目前sqoop沒有辦法把資料直接從Hbase匯出到mysql。必須要通過Hive建立2個表,一個外部表是基於這個Hbase表的,另一個是單純的基於hdfs的hive原生表,然後把外部表的資料匯入到原生表(臨時),然後通過hive將臨時表裡面的資料匯出到mysql

匯出順序:hbase→hive外部表→hive內部表→sqoop匯出→mysql

1、建立hive外部表  (將hbase的表結構與內容對映過去)

CREATE  EXTERNALTABLE h_employee(key int, id int, name string)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, info:id,info:name")

TBLPROPERTIES ("hbase.table.name" = "employee");

2、建立外部表

REATE TABLE  h_employee_export(key INT, id INT, name STRING)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054';

3、將基於Hbase的外部表匯入到新表裡面 h_employee_export(原生Hive表)

insert overwrite table h_employee_export select * from h_employe;

4、執行sqoop 匯入到已建立好的mysql表裡

#sqoop export --connect jdbc:mysql://node1:3306/demo_sqoop --username sqoopuser --password sqoopuser --table employee --export-dir /apps/hive/warehouse/db_hive.db/h_employee_export

宣告:大家在百度文庫中找到那篇《Sqoop 安裝使用文件》,也是本人上傳。只是今天才騰出時間,將之前的工作記錄都整理了一遍,放入CSDN中。