Sqoop是一個用來將Hadoop和關係型資料庫中的數據相互轉移的工具,可以將一個關係型資料庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型資料庫中。Sqoop是為大數據集設計的。Sqoop支持增量更新,將新記 ...
Sqoop是一個用來將Hadoop和關係型資料庫中的數據相互轉移的工具,可以將一個關係型資料庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型資料庫中。Sqoop是為大數據集設計的。Sqoop支持增量更新,將新記錄添加到最近一次的導出的數據源上,或者指定上次修改的時間戳。
接下來我們看一下如何安裝與做簡單示例
要安裝Sqoop與簡單應用,當然需要先安裝好Hadoop,Hive, 相關的資料庫,如Mysql,Sql Server
一、下載安裝包
1、 下載地址:選擇CDH相應版本下的
http://archive.cloudera.com/cdh5/cdh/5/
下載sqoop-1.4.5-cdh5.3.6.tar.gz安裝包
2、解壓sqoop-1.4.5-cdh5.3.6.tar.gz至指定目錄,如:/opt
mv sqoop-1.4.5-cdh5.3.6.tar.gz /opt
tar -zxvf sqoop-1.4.5-cdh5.3.6.tar.gz
二、配置環境變數
/etc/profile
#sqoop enviroment export SQOOP_HOME=/opt/sqoop-1.4.5-cdh5.3.6 export PATH=$PATH:$SQOOP_HOME/bin
三、Sqoop配置項更改
1、$HIVE_HOME/conf/hive-env.sh
example,這裡具體值是我本地測試目錄,可自行更改,如果數據操作不涉及Hbase,那麼相關Hbase的配置可以不配,如果沒有獨立的ZooKeeper集群,那麼ZooKeeper不用配置
export HADOOP_COMMON_HOME=/opt/hadoop/hadoop-2.7.3 #Set path to where hadoop-*-core.jar is available #export HADOOP_MAPRED_HOME= export HADOOP_MAPRED_HOME=/opt/hadoop/hadoop-2.7.3 #set the path to where bin/hbase is available #export HBASE_HOME= #Set the path to where bin/hive is available #export HIVE_HOME= export HIVE_HOME=/opt/hive/apache-hive-2.1.1.bin
2、配置jdbc驅動包
下載mysql的jdbc驅動包mysql-connector-java-5.1.6-bin.jar放入sqoop的lib目錄下$SQOOP_HOME/lib
下載sqlserver的jdbc驅動包sqljdbc4.jar放入sqoop的lib目錄下$SQOOP_HOME/lib
四、連接資料庫與表命令
因本地Sql server資料庫的表有數據,就以Sql Server為例,mysql相似
1、連接資料庫,查看資料庫列表
sqoop list-databases --connect 'jdbc:sqlserver://10.10.0.1:1433;instanceName=SQL2008;username=test;password=test;database=testDB'
2、連接sqlserver列出資料庫在表
sqoop list-tables \ --connect 'jdbc:sqlserver:// 10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=testDB’
3、導入資料庫中查詢的結果到指定的hdfs中目錄
sqoop import \ --connect 'jdbc:sqlserver://10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=TestDB' \ - -query 'select CustomerID,UserName from Customer where $CONDITIONS ' \ --target-dir /user/hive/warehouse/tmp2 \ --num-mappers 1
可選參數
--table //指定表名
--as-parquetfile //指定文件格式
--columns id,account //指定表的列
指定壓縮
--compress
--compression-codec org.apache.hadoop.io.compress.SnappyCodec
--fields-terminated-by '\t' //指定列的分隔符,這個很關鍵,在導入導出時最好指定
#增量導入
--incremental append
- -check-column id //以哪個欄位為依據,如id欄位
--last-value 4
4、從sql server中導入到hive資料庫中
sqoop import \ --connect 'jdbc:sqlserver://10.0.0.1:1433;instance=SQL2008;username=test;password=test;database=TestDB' \ --table Customer \ --fields-terminated-by ',' \ --num-mappers 1 \ --hive-import \ --hive-database mydatabase \ --hive-table test_table
5、從HDFS中將數據導入Sql Server資料庫
sqoop export \ --connect 'jdbc:sqlserver://10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=TestDB' \ --table ken_test \ --export-dir /user/hive/warehouse/tmp1/part-m-00000 \ --num-mappers 1
本人遇到的問題:
- 導出文件指定到文件名
- Error :Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434
當有多個資料庫實例時,註意開放相應的埠
如連接實例SQL2008,連接字元串中地址改為 sqlserver://10.0.0.1\SQL2008
- 一直報錯,導出不成功
ERROR tool.ExportTool: Error during export: Export job failed!
最後通過表的每一個欄位類型分析,主鍵的自增類型欄位是否影響數據導入,測試結果,確實如此,不能對自增長類型欄位直接賦值,當然是限於當前的環境
若是我們在資料庫客戶端是可以這樣操作的
附參數說明:
--append
添加到HDFS已存在數據記錄中
--as-sequencefile
import序列化的文件
--as-textfile
plain文件 ,預設
--columns <col,col,col…>
指定列import,逗號分隔,如:--columns "id,name"
--delete-target-dir
若已存在的import目錄,則刪除
--direct
直連模式,速度更快(HBase不支持)
--fetch-size <n>
一次從資料庫讀取n條數據
-m,--num-mappers <n>
建立 n 個併發執行task import
-e,--query <statement>
表達式<statement>執行,一般有條件查詢數據時用
--split-by <column-name>
根據column分隔實例
--autoreset-to-one-mappe
如果沒有主鍵和split-by參數 用one mapper import,此參數與split-by參數二選一
--target-dir <d>
HDFS中目標路徑,如/user/hive/warehouse
--warehouse-dir <d>
HDFS 中表的父級目錄
--where <where clause>
指定where從句,如果有雙引號,註意轉義 \$CONDITIONS,一定要加上,不能用or,子查詢,join
-z,--compress
開啟壓縮
--null-string <null-string>
string列為空指定為此值
--null-non-string <null-string>
非string列為空指定為此值,-null這兩個參數可選 , 如果不設置,會指定為"null"
--export-dir
指定導出的文件位置,不是目錄,具體化文件名