1. 程式人生 > >大資料學習——Sqoop入門使用

大資料學習——Sqoop入門使用

Sqoop

概述

Sqoop是一個用來將Hadoop和關係型資料庫中的資料相互轉移的工具,可以將一個關係型資料庫(例如 : MySQL ,Oracle ,Postgres等)中的資料導進到Hadoop的HDFS中,也可以將HDFS的資料導進到關係型資料庫中。
架構示意圖:

這裡寫圖片描述

Sqoop整合了Hive、Hbase和Oozie,通過map-reduce任務來傳輸資料,從而提供併發特性和容錯。

Sqoop1與Sqoop2

  • 兩個不同的版本,完全不相容
  • 版本號劃分區別,Apache版本:1.4.x(Sqoop1); 1.99.x(Sqoop2) CDH版本 : Sqoop-1.4.3-cdh4(Sqoop1) ; Sqoop2-1.99.2-cdh4.5.0 (Sqoop2)
  • Sqoop2比Sqoop1的改進
  • 引入Sqoop server,集中化管理connector等
  • 多種訪問方式:CLI,Web UI,REST API
  • 引入基於角色的安全機制

Sqoop1架構

這裡寫圖片描述

Sqoop2架構

這裡寫圖片描述

Sqoop1與Sqoop2比較

比較 Sqoop1 Sqoop2
架構 僅僅使用一個Sqoop客戶端 引入了Sqoop server集中化管理connector,以及rest api,web,UI,並引入安全機制
部署 部署簡單,安裝需要root許可權,connector必須符合JDBC模型 架構稍複雜,配置部署更繁瑣
使用 命令列方式容易出錯,格式緊耦合,無法支援所有資料型別,安全機制不夠完善,例如密碼暴露 多種互動方式,命令列、webUI、rest API、connector集中化管理,所有的連結安裝在Sqoop server上,完善許可權管理機制,connector規範化,僅僅負責資料的讀寫

安裝

wget http://mirror.bit.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
mv sqoop-1.4.6.tar.gz /home
cd /home
tar -zxf sqoop-1.4
.6.tar.gz rm sqoop-1.4.6.tar.gz cd /home/sqoop-1.4.6/lib/ # mysql wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.10/mysql-connector-java-5.1.10.jar # postgre wget https://jdbc.postgresql.org/download/postgresql-9.4-1206-jdbc4.jar

配置環境變數

vim /etc/profile

#sqoop
export SQOOP_HOME=/home/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin

source /etc/profile

配置檔案

cd /home/sqoop-1.4.6/conf/
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh

內容:

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.7.3

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/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=

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
vim /home/sqoop-1.4.6/bin/configure-sqoop
註釋掉下面部分(如果使用HCatalog Accumulo等則不用此操作)
## Moved to be a runtime check in sqoop.
if [ ! -d "${HCAT_HOME}" ]; then
  echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
  echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
fi
if [ ! -d "${ACCUMULO_HOME}" ]; then
  echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
  echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
fi

測試

sqoop version
sqoop import --help

使用示例

簡單示例:

sqoop import --connect jdbc:mysql://ip:3306/metastore --username hiveuser --password redhat --table TBLS

通過檔案配置引數:

sqoop --options-file /users/homer/work/import.txt --table TEST

import.txt

import
--connect
jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password 
redhat

使用說明

測試連線

sqoop list-databases --connect jdbc:postgresql://ip/testdb --username root --P

顯示錶

sqoop list-tables --connect jdbc:postgresql://ip/testdb --username root --P

從關係資料庫導HDFS

sqoop import --connect jdbc:postgresql://ip/testdb  --username root --P  --table fin_cashier_order --target-dir/user/hadoop/databases/ssa/fin_cashier_order -m 4

使用 sql 語句

$ sqoop import --connect jdbc:mysql://IP:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where \$CONDITIONS ' --split-by tbl_id -m 4 --target-dir /user/hive/result
上面命令通過 -m 1 控制併發的 map 數。

direct

$ sqoop import --connect jdbc:mysql://ip:3306/metastore --username hiveuser --password redhat --table TBLS --delete-target-dir --direct --default-character-set UTF-8 --target-dir /user/hive/result

指定檔案輸出格式

sqoop import --connect jdbc:mysql://ip:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by"\t" --lines-terminated-by "\n" --delete-target-dir --target-dir /user/hive/result

從HDFS導到關係資料庫(未驗證)

sqoop export --connect jdbc:mysql://hadoop003:3306/ssa --table fin_cashier_order2 --username root--password ****** --export-dirhdfs://jrtestcluster/user/hadoop/databases/ssa/fin_cashier_order/

其它引數:

引數 說明
–append 將資料追加到hdfs中已經存在的dataset中。使用該引數,sqoop將把資料先匯入到一個臨時目錄中,然後重新給檔案命名到一個正式的目錄中,以避免和該目錄中已存在的檔案重名。
–as-avrodatafile 將資料匯入到一個Avro資料檔案中
–as-sequencefile 將資料匯入到一個sequence檔案中
–as-textfile 將資料匯入到一個普通文字檔案中,生成該文字檔案後,可以在hive中通過sql語句查詢出結果。
–boundary-query 邊界查詢,也就是在匯入前先通過SQL查詢得到一個結果集,然後匯入的資料就是該結果集內的資料,格式如:–boundary-query ‘select id,no from t where id = 3’,表示匯入的資料為id=3的記錄,或者 select min(), max() from ,注意查詢的欄位中不能有資料型別為字串的欄位,否則會報錯
–columns 指定要匯入的欄位值,格式如:–columns id,username
–direct 直接匯入模式,使用的是關係資料庫自帶的匯入匯出工具。官網上是說這樣匯入會更快
–direct-split-size 在使用上面direct直接匯入的基礎上,對匯入的流按位元組數分塊,特別是使用直連模式從PostgreSQL匯入資料的時候,可以將一個到達設定大小的檔案分為幾個獨立的檔案。
–inline-lob-limit 設定大物件資料型別的最大值
-m,–num-mappers 啟動N個map來並行匯入資料,預設是4個,最好不要將數字設定為高於叢集的節點數
–query,-e 從查詢結果中匯入資料,該引數使用時必須指定–target-dir、–hive-table,在查詢語句中一定要有where條件且在where條件中需要包含 $CONDITIONS,示例:–query ‘select * from t where $CONDITIONS ’ –target-dir /tmp/t –hive-table t
–split-by 表的列名,用來切分工作單元,一般後面跟主鍵ID
–table 關係資料庫表名,資料從該表中獲取
–delete-target-dir 刪除目標目錄
–target-dir 指定hdfs路徑
–warehouse-dir 與 –target-dir 不能同時使用,指定資料匯入的存放目錄,適用於hdfs匯入,不適合匯入hive目錄
–where 從關係資料庫匯入資料時的查詢條件,示例:–where “id = 2”
-z,–compress 壓縮引數,預設情況下資料是沒被壓縮的,通過該引數可以使用gzip壓縮演算法對資料進行壓縮,適用於SequenceFile, text文字檔案, 和Avro檔案
–compression-codec Hadoop壓縮編碼,預設是gzip
–null-string 可選引數,如果沒有指定,則字串null將被使用
–null-non-string 可選引數,如果沒有指定,則字串null將被使用