郵箱:[email protected]
Sqoop是一款開源的工具,主要用於在Hadoop(Hive)與傳統的數據庫(mysql、postgresql…)間進行數據的傳遞,可以將一個關係型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型數據庫中.
Sqoop項目開始於2009年,最早是作爲Hadoop的一個第三方模塊存在,後來爲了讓使用者能夠快速部署,也爲了讓開發人員能夠更快速的迭代開發,Sqoop獨立成爲一個Apache項目.
Sqoop2的最新版本是1.99.7。請注意,2與1不兼容,且特徵不完整,它並不打算用於生產部署.
sqoop原理
- 將導入或導出命令翻譯成mapreduce程序來實現.
- 在翻譯出的mapreduce中主要是對inputformat和outputformat進行定製.
sqoop安裝
安裝Sqoop的前提是已經具備Java和Hadoop的環境.
下載並解壓
- 下載地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/
- 上傳安裝包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虛擬機中
- 解壓sqoop安裝包到指定目錄,如:
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
修改配置文件
Sqoop的配置文件與大多數大數據框架類似,在sqoop根目錄下的conf目錄中.
- 複製配置文件
cp sqoop-env-template.sh sqoop-env.sh
- 修改配置文件
sqoop依賴zookeeper,如果沒有安裝zookeeper可以先用默認的zookeeper
vim sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2
export HIVE_HOME=/opt/module/hive
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export ZOOCFGDIR=/opt/module/zookeeper-3.4.10
export HBASE_HOME=/opt/module/hbase
拷貝JDBC驅動
拷貝jdbc驅動包到sqoop的lib目錄下,如:
cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib/
驗證Sqoop
我們可以通過某一個command來驗證sqoop配置是否正確:
sqoop help
測試Sqoop是否能夠成功連接數據庫
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
出現如下測試成功
19/07/27 18:53:34 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
19/07/27 18:53:34 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/07/27 18:53:34 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hive_metadata
mysql
test
test2
配置環境變量
列出mysql中有哪些數據庫
[hadoop@hadoop3 ~]$ sqoop list-databases \
> --connect jdbc:mysql://hadoop1:3306/ \
> --username root \
> --password root
Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/04/12 13:43:51 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
18/04/12 13:43:51 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/04/12 13:43:51 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hivedb
mysql
performance_schema
test
[hadoop@hadoop3 ~]$
列出MySQL中的某個數據庫有哪些數據表:
[hadoop@hadoop3 ~]$ sqoop list-tables \
> --connect jdbc:mysql://hadoop1:3306/mysql \
> --username root \
> --password root
Sqoop的數據導入
從RDBMS導入到HDFS中
下面的命令用於從MySQL數據庫服務器中的emp表導入HDFS:
bin/sqoop import \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--table emp \
--m 1
導入到HDFS指定目錄
bin/sqoop import \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--target-dir /queryresult \指定目錄
--fields-terminated-by ‘\001’ \指定分隔符
--table emp
--split-by id
--m 1
RDBMS到HIVE
bin/sqoop import
--connect jdbc:mysql://hdp-node-01:3306/test
--username root
--password root
--table emp
--hive-import \增加導入hive聲明
--split-by id
--m 1
導入表數據子集
bin/sqoop import \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--where "city ='sec-bad'" \子集條件聲明
--target-dir /wherequery \
--table emp_add \
--m 1
Sqoop數據導出
數據是在HDFS 中“EMP/”目錄的emp_data文件中。所述emp_data如下:
1201, gopal, manager, 50000, TP
1202, manisha, preader, 50000, TP
1203, kalil, php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi, admin, 20000, TP
1206, satish p, grp des, 20000, GR
#### 首先需要手動創建mysql中的目標表
$ mysql
mysql> USE db;
mysql> CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
然後執行導出命令
bin/sqoop export \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--table employee \
--export-dir /user/hadoop/emp/