文件存儲HDFS和數據庫MySQL雙向數據遷移


本文檔介紹如何使用Sqoop工具實現文件存儲HDFS和關系型數據庫MySQL之間的雙向數據遷移。

背景信息

Sqoop是一款開源的工具,主要用於在Hadoop和結構化數據存儲(如關系數據庫)之間高效傳輸批量數據 。既可以將一個關系型數據庫(MySQL 、Oracle 、Postgres等)中的數據導入HDFS中,也可以將HDFS的數據導入到關系型數據庫中。

准備工作

現在Sqoop分為Sqoop1和Sqoop2,兩個版本並不兼容。本案例選擇使用sqoop1的穩定版本Sqoop 1.4.7 版本

1.下載Sqoop 1.4.7 版本

2.解壓安裝包。

tar -zxf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/hadoop/

3.配置環境變量。

(1) 執行vim /etc/profile命令,打開配置文件,添加如下內容。

export SQOOP_HOME=/home/hadoop/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$SQOOP_HOME/bin

(2) 執行source /etc/profile命令,使配置生效。

4.添加數據庫驅動。

(1) 下載MySQL鏈接包。

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.修改配置文件。

(1) 執行如下命令進入/home/hadoop/sqoop-1.4.7.bin__hadoop-2.6.0/conf目錄。

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上。

此處以遷移MySQL中的employee表為例,employee表中已寫入如下數據。
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.檢查遷移結果。

(1) 執行hadoop fs -ls /mysql2sqoop/table/sqoop_migrate命令,獲取遷移文件,此處以part-m-00000為例。

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

 

(2) 執行hadoop fs -cat /mysql2sqoop/table/sqoop_migrate/part-m-00000命令查看文件中的內容。

如果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命令進行遷移。

此處以遷移HDFS上mysqltest.txt中的數據為例,mysqltest.txt中已寫入如下數據。
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上。

此處以遷移MySQL中的employee表為例,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,女

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-102      測試用戶2       2019-08-113      測試用戶3       2019-08-124      測試用戶4       2019-08-135      測試用戶5       2019-08-14      女
...
Time taken: 0.105 seconds, Fetched: 14 row(s)

將Hive的數據遷移到MySQL上

將Hive的數據遷移到MySQL上,需要先在MySQL上創建好對應Hive數據結構的表,然后在集群Sqoop節點上使用sqoop export命令進行遷移。

此處以遷移Hive上hive_test.txt中的數據為例,hive_test.txt中已寫入如下數據。
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM