本文介紹如何使用Sqoop工具實現文件存儲 HDFS 版和關系型數據庫MySQL之間的雙向數據遷移。
前提條件
已開通文件存儲 HDFS 版服務并創建文件系統實例和掛載點。具體操作,請參見文件存儲HDFS版快速入門。
已搭建Hadoop集群。建議您使用的Hadoop版本不低于2.7.2,本文使用的Hadoop版本為Apache Hadoop 2.8.5。
已為Hadoop集群所有節點安裝JDK,且JDK版本不低于1.8。更多信息,下載JDK。
背景信息
Sqoop是一款開源的工具,主要用于在Hadoop和結構化數據存儲(例如關系數據庫)之間高效傳輸批量數據。既可以將一個關系型數據庫(MySQL、Oracle、Postgres等)中的數據導入文件存儲 HDFS 版中,也可以將文件存儲 HDFS 版的數據導入到關系型數據庫中。
步驟一:Hadoop集群掛載文件存儲 HDFS 版實例
在Hadoop集群中配置文件存儲 HDFS 版實例。具體操作,請參見掛載文件系統。
步驟二:安裝Sqoop
目前Sqoop分為Sqoop1和Sqoop2兩個版本,且兩個版本并不兼容。本文以Sqoop1的穩定版本Sqoop 1.4.7版本為例進行介紹。
執行以下命令,解壓安裝包。
tar -zxf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/
配置環境變量。
執行
vim /etc/profile
命令,打開配置文件,添加如下內容:export SQOOP_HOME=/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0 export PATH=$PATH:$SQOOP_HOME/bin
執行
source /etc/profile
命令,使配置生效。
添加數據庫驅動。
下載MySQL-Connector包。
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.48.tar.gz
解壓MySQL-Connector包。
tar -zxf mysql-connector-java-5.1.48.tar.gz
將MySQL-Connector包存放到Sqoop安裝目錄的lib目錄下。
cp ./mysql-connector-java-5.1.48/mysql-connector-java-5.1.48.jar ${SQOOP_HOME}/lib/
修改配置文件。
執行如下命令復制sqoop-env-template.sh,并命名為sqoop-env.sh。
cp ${SQOOP_HOME}/conf/sqoop-env-template.sh ${SQOOP_HOME}/conf/sqoop-env.sh
執行
vim ${SQOOP_HOME}/conf/sqoop-env.sh
命令打開配置文件,添加如下內容。export HADOOP_COMMON_HOME=/usr/local/hadoop-2.8.5 export HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME export HIVE_HOME=/usr/local/apache-hive-2.3.9-bin #若沒有安裝hive可不必添加此配置
執行
cp ${HIVE_HOME}/lib/hive-common-2.3.9.jar ${SQOOP_HOME}/lib/
命令復制文件。
執行如下命令驗證數據庫是否連接成功。
sqoop list-databases --connect jdbc:mysql://<dburi> --username 'username' --password 'password'
參數
說明
dburi
數據庫的訪問連接。例如
jdbc:mysql://0.0.0.0:3306/
。username
數據庫登錄用戶名。
password
用戶密碼。
如果回顯信息中顯示MySQL數據庫的名稱,則表示連接成功。
步驟三:數據遷移
下面介紹數據遷移方式及遷移后的結果驗證。
實踐一:將文件存儲 HDFS 版的數據遷移到MySQL
將文件存儲 HDFS 版的數據遷移到MySQL,需要先在MySQL上創建好對應數據結構的表,然后在集群Sqoop節點上使用sqoop export
命令進行遷移。
此處以遷移文件存儲HDFS版/sqoop2mysql/table/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,女
執行
create database sqoop_migrate;
命令,創建MySQL數據庫。執行以下命令,創建表。
use sqoop_migrate; 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;
執行以下命令,遷移數據。
sqoop export --connect jdbc:mysql://localhost:3306/sqoop_migrate --username 'userName' --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>
參數
說明
dburi
數據庫的訪問連接。例如
jdbc:mysql://localhost:3306/
。如果您的訪問連接中含有參數,則請加上單引號,例如'jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=UTF-8'
。dbname
數據庫的名字,例如user。
username
數據庫登錄用戶名。
password
用戶密碼。
tablename
MySQL數據庫中表的名稱。
hdfs-dir
存放待遷移數據的文件存儲 HDFS 版目錄。
驗證遷移結果。
執行
select * from employee;
命令查看表數據。如果表中有如下數據,則表示遷移成功。
實踐二:將MySQL的數據遷移到HDFS
在集群Sqoop節點上,使用sqoop import
命令將MySQL中的數據遷移到文件存儲 HDFS 版上。
此處以遷移MySQL中的employee表為例,employee表中已寫入如下數據。
執行以下命令遷移數據。
sqoop import --connect jdbc:mysql://localhost: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。
參數
說明
dburi
數據庫的訪問連接。例如
jdbc:mysql://172.x.x.x:3306/
。如果您的訪問連接中含有參數,則請加上單引號。例如
'jdbc:mysql://172.x.x.x.235:3306/mydatabase?useUnicode=true&characterEncoding=UTF-8'
。dbname
數據庫的名字。例如user。
username
數據庫登錄用戶名。
password
用戶密碼。
tablename
MySQL數據庫中表的名稱。
col
遷移表中列的名稱。
mode
該模式決定Sqoop如何定義哪些行為新的行。取值為append或lastmodified。
value
前一個導入中檢查列的最大值。
hdfs-dir
文件存儲 HDFS 版的寫入目錄。
檢查遷移結果。
執行
hadoop fs -ls /mysql2sqoop/table/sqoop_migrate
命令,獲取遷移文件信息。執行
hadoop fs -cat /mysql2sqoop/table/sqoop_migrate/part-m-00000
命令查看文件中的內容。如果part-m-00000文件中有如下內容,則表示遷移成功。
實踐三:將MySQL的數據遷移到Hive
在集群Sqoop節點上使用sqoop import
命令可以將MySQL上的數據遷移到Hive上。
此處以遷移MySQL中的employee表為例,employee表中已寫入如下數據。
執行以下命令遷移數據。
sqoop import --connect jdbc:mysql://localhost: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> --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --target-dir <hdfs-dir> --hive-table <hive-tablename>
參數
說明
dburi
數據庫的訪問連接。例如
jdbc:mysql://localhost:3306/
。如果您的訪問連接中含有參數,則請加上單引號,例如'jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=UTF-8'
。dbname
數據庫的名字。例如user。
username
數據庫登錄用戶名。
password
用戶密碼。
tablename
MySQL數據庫中表的名稱。
hdfs-dir
文件存儲 HDFS 版的寫入目錄。
hive-tablename
對應的Hive中的表名。
驗證遷移結果。
執行
select * from default.employee;
命令查看表數據,如果表中有如下數據,則表示遷移成功。
實踐四:將Hive的數據遷移到MySQL
將Hive的數據遷移到MySQL上,需要先在MySQL上創建好對應Hive數據結構的表,然后在集群Sqoop節點上使用sqoop export
命令進行遷移。
此處以遷移Hive上default.employee中的數據為例,該表中已寫入如下數據。
在MySQL上的sqoop_migrate庫中創建要導入的表。
use sqoop_migrate; CREATE TABLE `employee_from_hive`( `id` VARCHAR(20), `name` VARCHAR(20) NOT NULL DEFAULT '', `birth` VARCHAR(20) NOT NULL DEFAULT '', `sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`id`) );
執行
DESCRIBE FORMATTED default.employee;
命令查看表信息。執行以下命令遷移數據。
sqoop export --connect jdbc:mysql://localhost:3306/sqoop_migrate --username 'userid' --password 'userPW' --table employee_from_hive -m 1 --fields-terminated-by '\0001' --export-dir /user/hive/warehouse/employee
遷移命令格式:
sqoop export --connect jdbc:mysql://<dburi>/<dbname> --username <username> --password <password> --table <tablename> --export-dir <hive-dir> --fields-terminated-by <Splitter>
參數
說明
dburi
數據庫的訪問連接。例如
jdbc:mysql://localhost:3306/
。如果您的訪問連接中含有參數,則請加上單引號,例如'jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=UTF-8'
。dbname
數據庫的名字,例如user。
username
數據庫登錄用戶名。
password
用戶密碼。
tablename
MySQL數據庫中表的名稱。
hive-dir
存放待遷移數據的文件存儲 HDFS 版目錄。
Splitter
Hive表數據使用的分隔符。
驗證遷移結果。
執行
select * from sqoop_migrate.employee_from_hive;
命令查看表數據。如果表中有如下數據,則表示遷移成功。