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