一、概述
Sqoop是一款開源的資料導入導出工具,可以将傳統的關系型資料庫導出至HDFS,也可以将HDFS中的資料導出至關系型資料庫。
官網: http://sqoop.apache.org/
原理:在Hadoop生态體系中,計算基本依賴于MR,那麼Sqoop也是如此,Sqoop就是将Sqoop語句翻譯成MR程式,來實作一個資料導入和導出的操作。那就不難了解到Sqoop就是一個對于InpuFormat和OutputFormat進行特殊定制的MR程式。
二、Sqoop安裝
2.1 下載下傳
官方下載下傳位址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7![]()
sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解
2.2 解壓
上傳至Linux 伺服器,解壓在相關位置即可。
2.3 修改配置檔案
将conf目錄下的sqoop-env.template.sh改名
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.6.0
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop-2.6.0
#set the path to where bin/hbase is available
export HBASE_HOME=/home/hbase/hbase-1.2.4
#Set the path to where bin/hive is available
export HIVE_HOME=/home/hive/apache-hive-1.2.1-bin
#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
2.4 拷貝JDBC驅動
将Mysql或者其他使用到的資料的JDBC驅動拷貝到Sqoop根目錄下lib目錄。
3.5 驗證啟動
sqoop-version
預期的輸出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
./sqoop-list-databases --connect jdbc:mysql://HadoopNode00:3306 --username root --password root
預期輸出:
18/10/23 17:09:44 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
18/10/23 17:09:44 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/10/23 17:09:45 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hive
mysql
performance_schema
shortvideo
test
三、使用
3.1 導出資料
導出資料使用export關鍵字,指的就是從大資料叢集導入至傳統的關系型資料庫
3.1.1 HDFS 到RDBMS
這裡以 MySQL 為例
準備資料
準備資料需要在Mysql中建立新表
DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs` (
`uuid` varchar(255) NOT NULL,
`userid` varchar(255) DEFAULT NULL,
`fromUrl` varchar(255) DEFAULT NULL,
`dateString` varchar(255) DEFAULT NULL,
`timeString` varchar(255) DEFAULT NULL,
`ipAddress` varchar(255) DEFAULT NULL,
`browserName` varchar(255) DEFAULT NULL,
`pcSystemNameOrmobileBrandName` varchar(255) DEFAULT NULL,
`systemVersion` varchar(255) DEFAULT NULL,
`language` varchar(255) DEFAULT NULL,
`cityName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
資料導出
這裡資料是使用MR進行清洗後得到的資料
./sqoop export \
--connect jdbc:mysql://centos:3306/hadoop \
--username root \
--password root \
--table logs \
--export-dir /access_log/19-07-30clean04 \
--input-fields-terminated-by ' ' \
--m 1
./sqoop export \
--connect jdbc:mysql://centos:3306/nove \
--username root \
--password root \
--table money \
--export-dir /money_result \
--input-fields-terminated-by '\\m+' \
--m 1
3.2 導入資料
導入資料使用import關鍵字,指的就是從傳統的關系型資料庫導入至大資料叢集
3.2.1 RDBMS 到 HDFS
準備資料
資料庫中還是上述文檔中建立的logs。将logs中的資料導入至HDFS
導入資料
(1)全部導入
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--target-dir /sqoop_test/clean01 \
--num-mappers 1 \
--fields-terminated-by "|" \
(2)條件導入
通過手動指定查詢條件導入資料 ,在查詢語句中必須包含$CONDITIONS關鍵字
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--target-dir /sqoop_test/clean02 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by " " \
--query 'select * from logs where $CONDITIONS limit 1,2'
(3)導入指令列
其實和手動輸入查詢條件時一樣的效果 注意: 多列之間使用逗号進行分割
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--target-dir /sqoop_test/clean03 \
--num-mappers 1 \
--fields-terminated-by " " \
--columns userid,cityName
3.2.2 RDBMS 到 Hive
準備資料
還是上述建表語句
導入資料
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database baizhi \
--hive-table logs \
--delete-target-dir
填坑三部曲
解決辦法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
解決辦法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
這裡可以看出目前使用hive中logs是帶有分區的,但是在導入的時候沒有去指定具體是哪個分區,是以問題就在這裡。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-n77Bs2NS-1589640097545)(assets/1561101986300.png)]
從 sqoop import --help 給出幫助指令可以看到sqoop也提供了相關的解決方案,那隻需要在上述語句中加入相關字段即可:–hive-partition-key day|–hive-partition-value 19-06-20
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database baizhi \
--hive-table logs \
--delete-target-dir \
--hive-partition-key day \
--hive-partition-value 19-07-30
從hive導出資料
sqoop export \
--connect "jdbc:mysql://192.168.134.151:3306/logs?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password yhm1211. \
--table logs \
--export-dir /user/hive/warehouse/logs/day=18-10-18 \
--input-fields-terminated-by ' ' \
3.2.3 RDBMS 到 HBase
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--columns "uuid,userid,fromurl" \
--column-family "log_basic" \
--hbase-create-table \
--hbase-row-key "uuid" \
--hbase-table "logs" \
--num-mappers 1 \
--split-by uuid
很幸運,使用Sqoop1.4.7中可以在HBase1.2.4中自動建立相關表
四、常見參數詳解
https://blog.csdn.net/myrainblues/article/details/43673129
https://blog.csdn.net/wtzhm/article/details/81810159
4.1 頂級指令列舉
來源 sqoop-help
指令 | 說明 |
---|---|
codegen | 資料生成Java并打包 |
create-hive-table | 擷取資料庫中某張表 |
eval | 檢視 SQL 執行結果 |
export | 将叢集資料導出 |
help | 列印 sqoop 幫助資訊 |
import | 将資料導入到叢集 |
import-all-tables | 導入某個資料庫下所有表到 HDFS 中 |
import-mainframe | 将資料集從大型機伺服器導入到HDFS |
job | 用來生成一個 sqoop的任務,生成後,該任務并不執行,除非使用指令執行該任務。 |
list-databases | 列出所有資料庫名 |
list-tables | 列出某個資料庫下所有表 |
merge | 将 HDFS 中不同目錄下面的資料合在一起,并存放在指定的目錄中 |
metastore | 記錄 sqoop job 的中繼資料資訊,如果不啟動 metastore 執行個體,則預設的中繼資料存儲目錄為:~/.sqoop,如果要更改存儲目錄,可以 在 配 置 文 件sqoop-site.xml中進行更改。 |
version | 列印 sqoop 版本資訊 |
4.2 頂級指令詳解
export是導出至RDBMS
4.2.1 共用參數:資料庫
序号 | 參數 | 說明 |
---|---|---|
1 | –connect | 連接配接關系型資料庫的 URL |
2 | –connection-manager | 指定要使用的連接配接管理類 |
3 | –driver | Hadoop 根目錄 |
4 | –help | 列印幫助資訊 |
5 | –password | 連接配接資料庫的密碼 |
6 | –username | 連接配接資料庫的使用者名 |
7 | –verbose | 在控制台列印出詳細資訊 |
4.2.2 共用參數:import
序号 | 參數 | 說明 |
---|---|---|
1 | –enclosed-by | 給字段值前加上指定的字元 |
2 | –escaped-by | 對字段中的雙引号加轉義符 |
3 | –fields-terminated-by | 設定每個字段是以什麼符号作為結束,預設為逗号 |
4 | –lines-terminated-by | 設定每行記錄之間的分隔符,預設是\n |
5 | –mysql-delimiters | Mysql 預設的分隔符設定,字段之間以逗号分隔,行之間以\n 分隔,預設轉義符是\,字段值以單引号包裹 |
6 | –optionally-enclosed-by | 給帶有雙引号或單引号的字段值前後加上指定字元 |
4.2.3 共用參數:export
序号 | 參數 | 說明 |
---|---|---|
1 | –input-enclosed-by | 對字段值前後加上指定字元 |
2 | –input-escaped-by | 對含有轉移符的字段做轉義處理 |
3 | –input-fields-terminated-by | 字段之間的分隔符 |
4 | –input-lines-terminated-by | 行之間的分隔符 |
5 | –input-optionally-enclosed-by | 給帶有雙引号或單引号的字段前後加上指定字元 |
4.2.4 共用參數:hive
序号 | 參數 | 說明 |
---|---|---|
1 | –hive-delims-replacement | 用自定義的字元串替換掉資料中的\r\n和\013 \010等字元 |
2 | –hive-drop-import-delims | 在導入資料到 hive 時,去掉資料中的\r\n\013\010 這樣的字元 |
3 | –map-column-hive | 生成 hive 表時,可以更改生成字段的資料類型 |
4 | –hive-partition-key | 建立分區,後面直接跟分區名,分區字段的預設類型為string |
5 | –hive-partition-value | 導入資料時,指定某個分區的值 |
6 | –hive-home | hive 的安裝目錄,可以通過該參數覆寫之前預設配置的目錄 |
7 | –hive-import | 将資料從關系資料庫中導入到 hive 表中 |
8 | –hive-overwrite | 覆寫掉在 hive 表中已經存在的資料 |
9 | –create-hive-table | 預設是 false,即,如果目标表已經存在了,那麼建立任務失敗 |
10 | –hive-table | 後面接要建立的 hive 表,預設使用 MySQL 的表名 |
11 | –table |
4.3 次級參數詳解
次級參數值得就是使用導出或者導入時使用的相關參數,均可使用–help來獲得
4.3.1 import
import導入指令在上述文檔中已經提到過,在這裡就不再列舉基本的操作,而是對資料進行增量操作
增量導入
首先是增量導入資料至Hive,但是指的注意的是現在不能指定hive相關的參數,說白了就是使用導入HDFS的方式導入hive,在此基礎上加上增量導入相關參數
準備資料
開始導入
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table user01 \
--hive-import
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20 \
--num-mappers 1 \
--fields-terminated-by " " \
--incremental append \
--check-column uuid \
-m 1
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20 \
--num-mappers 1 \
--fields-terminated-by " " \
--append \
-m 1