大資料學習——Sqoop入門使用
阿新 • • 發佈:2019-01-24
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將被使用 |