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
指定導出的文件位置,不是目錄,具體化文件名