超詳細的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中。