Sqoop
什么是 Sqoop
- Sqoop 是一款開源的工具,主要用於在 Hadoop(Hive)與傳統的數據庫(mysql、postgresql...) 間進行數據的傳遞,可以將一個關系型數據庫(例如 : MySQL ,Oracle ,Postgres 等)中的 數據導進到 Hadoop 的 HDFS 中,也可以將 HDFS 的數據導進到關系型數據庫中
- Sqoop2 的最新版本是 1.99.7。請注意,2 與 1 不兼容,且特征不完整,它並不打算用於生產部署。
Sqoop 原理
- 將導入或導出命令翻譯成 mapreduce 程序來實現。
- 在翻譯出的 mapreduce 中主要是對 inputformat 和 outputformat 進行定制。
Sqoop 安裝(重點)
-
解壓 Sqoop 包到指定目錄
- tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
-
修改 & 重命名配置文件
-
重命名配置文件
- mv sqoop-env-template.sh sqoop-env.sh
-
修改配置文件
-
export HADOOP_COMMON_HOME={hadoop 安裝目錄}
export HADOOP_MAPRED_HOME={hadoop 安裝目錄}
export HIVE_HOME={Hive 安裝目錄} -
注:配置文件中還可以添加其他組件的配置,例如 Zookeeper,Hbase 等,不設置的情況下,會報警告
-
-
-
拷貝 jdbc 驅動到 sqoop 的 lib 目錄下
- cp mysql-connector-java-5.1.37.jar /opt/module/sqoop-1.4.6/lib/
-
配置環境變量,方便執行命令
-
export SQOOP_HOME={sqoop 安裝目錄}
export PATH=$PATH:$SQOOP_HOME/bin -
生效環境變量
- source /etc/profile
-
-
連接 MySQL 測試
-
sqoop list-databases --connect jdbc:mysql://主機名:3306/ --username root --password mysql密碼
-
出現的日志包含如下結果則 MySQL 連接成功
-
information_schema
metastore
mysql
oozie
performance_schema
-
-
Sqoop 使用
環境准備
- 創建 MySQL 數據庫
- create database sqoop_test;
- 創建表
- create table sqoop_tbl (id int(4) PRIMARY KEY AUTO_INCREMENT,name varchar(255));
- 添加數據
- insert into sqoop_tbl (name) values ('zhangsan');
- insert into sqoop_tbl (name) values ('lisi');
- insert into sqoop_tbl (name) values ('wangwu');
- insert into sqoop_tbl (name) values ('zhaoliu');
導入數據(重點)
- 在 Sqopp 中,導入的概念指的是從非大數據集群(MySQL等)向大數據集群(HDFS,HIVE等)傳輸數據,叫做導入,使用 import 關鍵字
全部數據導入
-
sqoop import
--connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test
--username root --password 111111
--table sqoop_tbl
--target-dir /user/sqoop_test
--delete-target-dir
--num-mappers 1
--fields-terminated-by "\t"
sqoop import Sqoop 導入命令
--connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test 導入的目標連接
--username root --password 密碼 連接的密碼
--table sqoop_tbl 導入數據的來源表
--target-dir /user/sqoop_test 導入到 hdfs 上的目錄
--delete-target-dir 若 hdfs 上的目錄存在,則刪除
--num-mappers 1 設置 MapTask 的任務數
--fields-terminated-by "\t" 導入的數據使用什么分隔符
查詢導入
-
sqoop import
--connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test
--username root
--password 111111
--target-dir /user/sqoop_test2
--delete-target-dir
--num-mappers 1
--fields-terminated-by "\t"
--query 'select * from sqoop_tbl where id =1 and $CONDITIONS;'
--query 'select * from sqoop_tbl where id =1 and $CONDITIONS;' 查詢的語句,其中,$CONDITIONS 是一個必須值
注: 如果 query 后使用的是雙引號,則$CONDITIONS 前必須加轉移符,防止 shell 識別為自己的 變量。
導入指定列
-
sqoop import --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --target-dir user/sqoop_test4 --delete-target-dir --num-mappers 1 --fields-terminated-by '\t' --columns id,name --table sqoop_tbl
--columns id,name 導入指定的字段
查詢條件導入
-
sqoop import --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --target-dir /user/sqoop-test4 --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --table sqoop_tbl --where 'id=4'
where 'id=4' 導入數據時,加上條件
導入數據到 Hive
-
sqoop import --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --table sqoop_tbl --num-mappers 1 --hive-import --fields-terminated-by '\t' --hive-overwrite --hive-table sqoop_tbl
--hive-import 導入數據到 Hive
--fields-terminated-by '\t' 行數據使用 \t 作為分隔符
--hive-overwrite 覆蓋 Hive 中的數據
--hive-table sqoop_tbl 指定導入到 Hive 的那張表補充: 該過程分為兩步,第一步將數據導入到 hdfs ,默認路徑是 /user/用戶名/表名,第二步將導入的數據遷移到 Hive 倉庫
導入數據到 Hbase
-
sqoop import --connect jdbc:mysql://hadoop102:3306/company --username root --password 000000 --table company --columns "id,name,sex" --column-family "info" --hbase-create-table --hbase-row-key "id" --hbase-table "hbase_company" --num-mappers 1 --split-by id
若沒學過 Hbase 了解即可,比賽時,大概率使用 Hive
導出數據(重點)
- 在 Sqoop 中,“導出”概念指:從大數據集群(HDFS,HIVE,HBASE)向非大數據集群 (RDBMS)中傳輸數據,叫做:導出,即使用 export 關鍵字。
Hive 導出到 MySQL
-
sqoop export --connect jdbc:mysql://master-3.x-wfb:3306/sqoop_test --username root --password 111111 --table sqoop_tbl --num-mappers 1 --export-dir /user/hive/warehouse/sqoop_tbl --input-fields-terminated-by '\t'
--export-dir /user/hive/warehouse/sqoop_tbl 導出數據的目錄
--input-fields-terminated-by '\t' 導出數據時,使用什么分隔符分割字段
--table sqoop_tbl 導出到 MySQL 的那張表
