Hadoop 之 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

     指定導出的文件位置,不是目錄,具體化文件名

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM