背景信息
Sqoop是一款开源的工具,主要用于在Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据 。既可以将一个关系型数据库(MySQL 、Oracle 、Postgres等)中的数据导入HDFS中,也可以将HDFS的数据导入到关系型数据库中。
准备工作
- 开通文件存储HDFS版服务并创建文件系统实例和挂载点,详情请参见:快速入门。
- 搭建Hadoop集群。建议您使用的Hadoop版本不低于2.7.2,本文档中使用的Hadoop版本为Apache Hadoop 2.8.5。
- 在Hadoop集群所有节点上安装JDK。本操作要求JDK版本不低于1.8。
- 在Hadoop集群中配置文件存储HDFS版实例,详情请参见:挂载文件系统。
安装Sqoop
现在Sqoop分为Sqoop1和Sqoop2,两个版本并不兼容。本案例选择使用Sqoop1的稳定版本Sqoop 1.4.7。
- 下载Sqoop 1.4.7 版本。
- 解压安装包。
tar -zxf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/
- 配置环境变量。
- 执行
vim /etc/profile
命令,打开配置文件,添加如下内容。
exportSQOOP_HOME=/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0 exportPATH=$PATH:$SQOOP_HOME/bin
b. 执行source /etc/profile
命令,使配置生效。
- 添加数据库驱动。
# 下载wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.48.tar.gz # 解压tar -zxf mysql-connector-java-5.1.48.tar.gz # 将MySQL链接包复制到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
b. 执行vim ${SQOOP_HOME}/conf/sqoop-env.sh
命令打开配置文件,添加如下内容。
exportHADOOP_COMMON_HOME=/usr/local/hadoop-2.8.5 exportHADOOP_MAPRED_HOME=$HADOOP_COMMON_HOMEexportHIVE_HOME=/usr/local/apache-hive-2.3.9-bin #若没有安装hive可不必添加此配置
c. 执行cp ${HIVE_HOME}/lib/hive-common-2.3.9.jar ${SQOOP_HOME}/lib/
命令复制文件。
- 执行如下命令验证数据库是否连接成功。
sqoop list-databases --connect jdbc:mysql://<dburi> --username'username'--password'password'
如果回显信息中显示MySQL数据库的名称,则表示连接成功。
参数 |
说明 |
dburi |
数据库的访问连接,例如: jdbc:mysql://localhost:3306/。 |
username |
数据库登录用户名。 |
password |
用户密码。 |
验证
将文件存储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,女
- 创建MySQL数据库。
create database sqoop_migrate;
- 创建表。
use sqoop_migrate;CREATETABLE `employee` ( `e_id` varchar(20)NOTNULL DEFAULT '', `e_name` varchar(20)NOTNULL DEFAULT '', `e_birth` varchar(20)NOTNULL DEFAULT '', `e_sex` varchar(10)NOTNULL DEFAULT '', PRIMARY KEY (`e_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 执行以下命令迁移数据。
sqoop export--connect jdbc:mysql://localhost:3306/sqoop_migrate --username'userName'--password'userPW'--num-mappers1--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:/// --username --password --table --export-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-mappers1--columns"e_id,e_name,e_birth,e_sex"--direct
命令格式:sqoop import --connect jdbc:mysql:/// --username --password --table --check-column --incremental --last-value --target-dir
参数说明如下所示,更多详情请参见Sqoop Import。
参数 |
说明 |
dburi |
数据库的访问连接。例如:jdbc:mysql://localhost:3306/ 。 如果您的访问连接中含有参数,则请加上单引号,例如: 'jdbc:mysql://localhost: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
命令,获取迁移文件。
b. 执行hadoop fs -cat /mysql2sqoop/table/sqoop_migrate/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-m1
迁移命令格式:sqoop import --connect jdbc:mysql:/// --username --password --table --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --target-dir --hive-table
参数 |
说明 |
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;CREATETABLE `employee_from_hive`( `id` VARCHAR(20), `name` VARCHAR(20)NOTNULL DEFAULT '', `birth` VARCHAR(20)NOTNULL DEFAULT '', `sex` VARCHAR(10)NOTNULL 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 -m1--fields-terminated-by'\0001'--export-dir /user/hive/warehouse/employee
迁移命令格式:sqoop export --connect jdbc:mysql:/// --username --password --table --export-dir --fields-terminated-by
参数 |
说明 |
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;
命令查看表数据。
如果表中有如下数据,则表示迁移成功。
了解更多关于文件存储HDFS版的产品信息,欢迎访问https://www.aliyun.com/product/alidfs
如果您对文件存储HDFS版有任何问题,欢迎钉钉扫描以下二维码加入文件存储HDFS版技术交流群。