本文檔介紹如何使用Sqoop工具實現文件存儲HDFS和關系型數據庫MySQL之間的雙向數據遷移。
背景信息
Sqoop是一款開源的工具,主要用於在Hadoop和結構化數據存儲(如關系數據庫)之間高效傳輸批量數據 。既可以將一個關系型數據庫(MySQL 、Oracle 、Postgres等)中的數據導入HDFS中,也可以將HDFS的數據導入到關系型數據庫中。
准備工作
現在Sqoop分為Sqoop1和Sqoop2,兩個版本並不兼容。本案例選擇使用sqoop1的穩定版本Sqoop 1.4.7 版本。
tar -zxf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/hadoop/
3.配置環境變量。
export SQOOP_HOME=/home/hadoop/sqoop-1.4.7.bin__hadoop-2.6.0 export PATH=$PATH:$SQOOP_HOME/bin
4.添加數據庫驅動。
wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar
(2) 將MySQL鏈接包存放到Sqoop安裝目錄的lib目錄下。
cp mysql-connector-java-5.1.38.jar /home/hadoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
5.修改配置文件。
cd /home/hadoop/sqoop-1.4.7.bin__hadoop-2.6.0/conf
(2) 執行如下命令復制sqoop-env-template.sh,並命名為sqoop-env.sh。
cp sqoop-env-template.sh sqoop-env.sh
(3) 執行vim sqoop-env.sh命令打開配置文件,添加如下內容。
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.7.2 export HADOOP_MAPRED_HOME=/home/hadoop/hadoop-2.7.2 export HIVE_HOME=/home/hadoop/hive-2.1.0 #若沒有安裝hive、hbase可不必添加此配置 export HBASE_HOME=/home/hadoop/hbase-1.2.2 #若沒有安裝hive、hbase可不必添加此配置
6.執行如下命令驗證數據庫是否連接成功。
sqoop list-databases --connect jdbc:mysql://<dburi> --username 'username' --password 'password'

如果回顯信息中顯示MySQL數據庫的名稱,則表示連接成功。
將MySQL的數據遷移到HDFS上
在集群Sqoop節點上,使用sqoop import命令將MySQL中的數據遷移到HDFS上。
01,測試用戶1,1990-01-01,男 02,測試用戶2,1990-12-21,男 03,測試用戶3,1990-05-20,男 04,測試用戶4,1990-08-06,男 05,測試用戶5,1991-12-01,女
1.執行以下命令遷移數據。
sqoop import --connect jdbc:mysql://172.x.x.x:3306/sqoop_migrate --username 'userid' --password 'userPW' --table employee --target-dir /mysql2sqoop/table/sqoop_migrate --num-mappers 1 --columns "e_id,e_name,e_birth,e_sex" --direct
命令格式:sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --target-dir <hdfs-dir>
參數說明如下所示,更多詳情請參見Sqoop Import。
2.檢查遷移結果。
Found 2 items -rwxrwxrwx 3 root root 0 2019-08-21 14:42 /mysql2sqoop/table/sqoop_migrate/_SUCCESS -rwxrwxrwx 3 root root 200 2019-08-21 14:42 /mysql2sqoop/table/sqoop_migrate/part-m-00000
01,測試用戶1,1990-01-01,男 02,測試用戶2,1990-12-21,男 03,測試用戶3,1990-05-20,男 04,測試用戶4,1990-08-06,男 05,測試用戶5,1991-12-01,女
將HDFS的數據遷移到MySQL上
將HDFS的數據遷移到MySQL上,需要先在MySQL上創建好對應HDFS數據結構的表,然后在集群Sqoop節點上使用sqoop export命令進行遷移。
6,測試用戶6,2019-08-10,男 7,測試用戶7,2019-08-11,男 8,測試用戶8,2019-08-12,男 9,測試用戶9,2019-08-13,女 10,測試用戶10,2019-08-14,女
1.創建數據庫。
create database sqoop_migrate;
2.使用已創建的數據庫。
use sqoop_migrate;
3.創建表。
CREATE TABLE `employee` ( `e_id` varchar(20) NOT NULL DEFAULT '', `e_name` varchar(20) NOT NULL DEFAULT '', `e_birth` varchar(20) NOT NULL DEFAULT '', `e_sex` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`e_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
4.執行以下命令遷移數據。
sqoop export --connect jdbc:mysql://172.0.0.0:3306/sqoop_migrate --username 'userid' --password 'userPW' --num-mappers 1 --table employee --columns "e_id,e_name,e_birth,e_sex" --export-dir '/sqoop2mysql/table/mysqltest.txt' --fields-terminated-by ','
遷移命令格式:sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <hdfs-dir>

5.驗證遷移結果。
(1) 執行以下命令進入數據庫。
mysql -uroot -p
(2)執行以下命令使用數據庫。
use sqoop_migrate;
(3)執行 select * from employee; 命令查詢表數據。
如果表中有如下數據,則表示遷移成功。
... | 6 | 測試用戶6 | 2019-08-10 | 男 | | 7 | 測試用戶7 | 2019-08-11 | 男 | | 8 | 測試用戶8 | 2019-08-12 | 男 | | 9 | 測試用戶9 | 2019-08-13 | 女 | | 10 | 測試用戶10 | 2019-08-14 | 女 | +------+---------------+------------+-------+ 10 rows in set (0.00 sec)
將MySQL的數據遷移到Hive上
在集群Sqoop節點上使用sqoop import命令可以將MySQL上的數據遷移到Hive上。
1,測試用戶1,2019-08-10,男 2,測試用戶2,2019-08-11,男 3,測試用戶3,2019-08-12,男 4,測試用戶4,2019-08-13,女 5,測試用戶5,2019-08-14,女
1.執行以下命令遷移數據。
sqoop import --connect jdbc:mysql://172.0.0.0:3306/sqoop_migrate --username 'userid' --password 'PW' --table employee --hive-import --hive-database default --create-hive-table --hive-overwrite -m 1 ;
遷移命令格式:sqoop import --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --check-column <col> --incremental <mode> --last-value <value> --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --target-dir <hdfs-dir> --hive-table <hive-tablename>

2.驗證遷移結果。
執行select * from default.employee;命令查看表數據,如果表中有如下數據,則表示遷移成功。
1 測試用戶1 2019-08-10 男 2 測試用戶2 2019-08-11 男 3 測試用戶3 2019-08-12 男 4 測試用戶4 2019-08-13 女 5 測試用戶5 2019-08-14 女 ... Time taken: 0.105 seconds, Fetched: 14 row(s)
將Hive的數據遷移到MySQL上
將Hive的數據遷移到MySQL上,需要先在MySQL上創建好對應Hive數據結構的表,然后在集群Sqoop節點上使用sqoop export命令進行遷移。
1,測試用戶1,2019-08-10,男 2,測試用戶2,2019-08-11,男 3,測試用戶3,2019-08-12,男 4,測試用戶4,2019-08-13,女 5,測試用戶5,2019-08-14,女
1.在MySQL上的sqoop_migrate庫中創建好要導入的表。
use sqoop_migrate ; CREATE TABLE `employeeOnHive`( `id` VARCHAR(20), `name` VARCHAR(20) NOT NULL DEFAULT '', `birth` VARCHAR(20) NOT NULL DEFAULT '', `sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`id`) );
2.執行以下命令遷移數據。
sqoop export --connect jdbc:mysql://172.0.0.0:3306/sqoop_migrate --username 'userid' --password 'userPW' --table employeeOnHive -m 1 --fields-terminated-by ',' --export-dir /user/hive/warehouse/employeeonhive
遷移命令格式:sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <hive-dir> --fields-terminated-by <Splitter>

3.驗證遷移結果。
(1)執行以下進入數據庫。
mysql -uroot -p
(2)執行以下命令使用數據庫。
use sqoop_migrate;
(3)執行select * from sqoop_migrate.employeeOnHive;命令查看表數據。
如果表中有如下數據,則表示遷移成功。
+----+---------------+------------+-----+ | id | name | birth | sex | +----+---------------+------------+-----+ | 1 | 測試用戶1 | 2019-08-10 | 男 | | 2 | 測試用戶2 | 2019-08-11 | 男 | | 3 | 測試用戶3 | 2019-08-12 | 男 | | 4 | 測試用戶4 | 2019-08-13 | 女 | | 5 | 測試用戶5 | 2019-08-14 | 女 | +----+---------------+------------+-----+ 5 rows in set (0.00 sec)
https://help.aliyun.com/document_detail/135296.html


