大数据技术之Hadoop(十)——Sqoop数据迁移

目录

一、Sqoop概述

1、Sqoop认识

2、Sqoop原理

(1)导入原理

(2)导出原理

二、Sqoop安装配置

1、下载安装

2、MySQL配置启动

3、配置Sqoop环境

4、Sqoop 效果测试

 三、Sqoop数据导入

1、MySQL表数据导入HDFS

2、MySQL表数据增量导入 HDFS

3、MySQL表数据导入Hive

4、MySQL表数据子集导入 

四、Sqoop 数据导出

参考书籍


一、Sqoop概述

1、Sqoop认识

        Sqoop 是 Apache 旗下的一款开源工具,该项目开始于2009年,最早是作为 Hadoop 的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速迭代开发,在2013年,独立成为 Apache 的一个顶级开源项目。

        Sqoop 主要用于在 Hadoop 和关系数据库或大型机器之间传输数据,可以使用 Sqoop 工具将数据从关系数据库管理系统导入到 Hadoop 分布式文件系统中,或者将 Hadoop 中的数据转换导出到关系数据库管理系统。

        目前 Sqoop 主要分为 Sqoop1 和 Sqoop2 两个版本,其中版本号为 1.4.x 属于Sqoop1,而版本号 1.99.x 属于 Sqoop2。这两版本开发时的定位方向不同,体系结构具有很大的差异,因此它们之间互不兼容。

        Sqoop1 功能结构简单,部署方便,提供命令行操作方式,主要适用于系统服务管理人员进行简单的数据迁移操作;Sqoop2 功能完善、操作简便,同时支持多种访问模式(命令行操作、Web 访问和 Rest API),引入角色安全机制增加安全性等多种优点,但是结果复杂,配置部署更加繁琐。

2、Sqoop原理

        Sqoop是传统关系数据库服务器与Hadoop间进行数据同步的工具,其底层利用 MapReduce 并行计算模型以批处理方式加快了数据传输速度,并且具有较好的容错性功能。

        通过客户端CLI(命令行界面)方式或Java API方式调用 Sqoop 工具,Sgoop可以将指令转换为对应的 MapReduce作业(通常只涉及Map任务,每个Map任务从数据库中读取一片数据,这样多个 Map 任务实现并发地复制,可以快速地将整个数据复制到 HDFS上),然后将关系数据库和 Hadoop中的数据进行相互转换,从而完成数据的迁移。

        可以说,Sqoop是关系数据库与 Hadoop 之间的数据桥梁,这个桥梁的重要组件是 Sqoop 连接器,它用于实现与各种关系数据库的连接,从而实现数据的导人和导出操作。 Sqoop连接器能够支持大多数常用的关系数据库,如MySQL、Oracle、DB2 和 SQL Server等,同时它还有一个通用的 JDBC 连接器,用于连接支持JDBC协议的数据库。

(1)导入原理

        在导人数据之前,Sqoop 使用 JDBC 检查导人的数据表,检索出表中的所有列以及列的 SQL 数据类型,并将这些 SQL 类型映射为 Java 数据类型,在转换后的 MapReduce 应用中使用这些对应的 Java 类型来保存字段的值,Sqoop 的代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录。

(2)导出原理

        在导出数据之前,Sqoop 会根据数据库连接字符串来选择一个导出方法,对于大部分系统来说,Sqoop 会选择 JDBC。Sqoop 会根据目标表的定义生成一个 Java 类,这个生成的类能够从文本中解析出记录数据,并能够向表中插入类型合适的值,然后启动一个 MapReduce 作业,从 HDFS 中读取源数据文件,使用生成的类解析出记录,并且执行选定的导出方法。

二、Sqoop安装配置

1、下载安装

将sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz下载到/export/software/目录下。

        官网地址

http://sqoop.apache.org/icon-default.png?t=MBR7http://sqoop.apache.org/      

          sqoop-1.4.7载地址

http://archive.apache.org/dist/sqoop/1.4.7/icon-default.png?t=MBR7http://archive.apache.org/dist/sqoop/1.4.7/

进入目录/export/software/,执行如下命令,将 sqoop-1.4.7 解压到 /export/servers/ 下。

tar -xzvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /export/servers/

将安装目录 sqoop-1.4.7.bin__hadoop-2.6.0 重命名为 sqoop-1.4.7 

进入目录/export/servers/,执行命令
cd /export/servers/
mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7

复制hive的相关jar包 

cp $HIVE_HOME/lib/hive-common-1.2.2.jar /export/servers/sqoop-1.4.7/lib
cp $HIVE_HOME/lib/hive-shims*.jar /export/servers/sqoop-1.4.7/lib

2、MySQL配置启动

MariaDB 是替换相同 MySQL 版本的二进制代码,是 MySQL 中的增强型替代品。系统中已经安装了MariaDB。
设置开机自启
systemctl enable mariadb  

打开数据库服务
systemctl start mariadb   

设置root密码与授权
如果root密码没有设置过,需要执行下列命令,将数据库超级用户 root 密码设置为 123456
mysql
mysql>use mysql;
mysql>update user set Password=PASSWORD('123456') where user='root';
mysql>grant all PRIVILEGES on *.* to 'root'@'% ' identified by '123456' with grant option;
mysql>FLUSH PRIVILEGES;
mysql>quit

修改密码后,数据库的登录命令如下:
mysql -uroot -p123456

3、配置Sqoop环境

重命名生成 sqoop-env.sh 配置文件,添加Hadoop环境变量

cd /export/servers/sqoop-1.4.7/conf 
mv sqoop-env-template.sh sqoop-env.sh

修改sqoop-env.sh配置文件,添加Hadoop环境变量,具体内容如下:

export HADOOP_COMMON_HOME=/export/servers/hadoop-2.10.1
export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.10.1
export HIVE_HOME=/export/servers/hive
export ZOOKEEPER_HOME=/export/servers/zookeeper
export ZOOCFGDIR=/export/servers/zookeeper/conf

 修改/etc/profile,添加Sqoop执行路径

vi /etc/profile

添加如下2行:
export SQOOP_HOME=/export/servers/sqoop-1.4.7
export PATH=$PATH:$SQOOP_HOME/bin

执行如下指令,刷新配置文件:
source /etc/profile 

复制 mysql 数据库的 JDBC 驱动包到 /export/servers/sqoop-1.4.7/lib 下

之前配置Hive数据仓库的时候已经将驱动包放入hive的lib目录下,这里我们可以复制过来
cp -r /export/servers/hive/lib/mysql-connector-java-8.0.20.jar /export/servers/sqoop-1.4.7/lib/

验证安装是否成功 

sqoop version 

         这里说明一下有的软件没有配置,是因为没有使用,并不影响后续操作。

4、Sqoop 效果测试

执行如下指令,列出mysql数据库中的所有数据库名。
sqoop list-databases -connect jdbc:mysql://localhost:3306/ --username root --password 123456

执行如下指令,列出mysql数据库中数据库mysql的所有数据表名。
sqoop list-tables -connect jdbc:mysql://localhost:3306/mysql --username root --password 123456

效果如下:

 

 三、Sqoop数据导入

        在 MySQL 数据库中创建 userdb 数据库,创建3张表:emp、emp_add、和emp_conn,并导入初始化数据。

在Sqoop目录下创建一个data目录,用来存放执行文件的
mkdir -p /export/servers/sqoop-1.4.7/data

进入data目录创建一个名为userdb.sql的文件
在里面填写Mysql的相关代码,代码如下:

Create database if not exists  userdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

use userdb;

DROP TABLE IF EXISTS `emp`; 
CREATE TABLE emp ( 
	id int(11) NOT NULL, 
	name varchar(100) DEFAULT NULL, 
	deg varchar(100) DEFAULT NULL,
	salary int(11) DEFAULT NULL, 
	dept varchar(10) DEFAULT NULL,
	PRIMARY KEY (id)
);

insert into emp values ('1201', 'gopal', 'manager', 50000, 'TP');
insert into emp values ('1202', 'manisha', 'Proof reader', 50000, 'TP');
insert into emp values ('1203', 'khalil', 'php dev', 50000, 'AC');
insert into emp values ('1204', 'prasanth', 'php dev', 50000, 'AC');
insert into emp values ('1205', 'kranthi', 'admin', 50000, 'TP');

DROP TABLE IF EXISTS `emp_add`; 
CREATE TABLE emp_add ( 
	id int(11) NOT NULL, 
	hno varchar(100) DEFAULT NULL, 
	street varchar(100) DEFAULT NULL,
	city varchar(100) DEFAULT NULL, 
	PRIMARY KEY (id)
);

insert into emp_add values ('1201', '288A', 'vgiri', 'jublee');
insert into emp_add values ('1202', '1081', 'aoc', 'sec-bad');
insert into emp_add values ('1203', '144Z', 'pgutta', 'hyd');
insert into emp_add values ('1204', '78B', 'old city', 'sec-bad');
insert into emp_add values ('1205', '720X', 'hitec', 'sec-bad');

DROP TABLE IF EXISTS `emp_conn`; 
CREATE TABLE emp_conn ( 
	id int(11) NOT NULL, 
	phno varchar(100) DEFAULT NULL, 
	email varchar(100) DEFAULT NULL,
	PRIMARY KEY (id)
);

insert into emp_conn values ('1201', '2356742', 'gopal@tp.com');
insert into emp_conn values ('1202', '1661663', 'manisha@tp.com');
insert into emp_conn values ('1203', '8887776', 'khalil@tp.com');
insert into emp_conn values ('1204', '9988774', 'prasanth@tp.com');
insert into emp_conn values ('1205', '1231231', 'kranthi@tp.com');

show tables;

接着启动Mysql数据库执行以下操作
MariaDB [(none)]>  source userdb.sql

执行完成后。会显示如下3个表名:
+------------------+
| Tables_in_userdb |
+------------------+
| EMP              |
| emp              |
| emp_add          |
| emp_conn         |
+------------------+
4 rows in set (0.00 sec)

注:userdb.sql应在当前目录下。

1、MySQL表数据导入HDFS

执行如下指令,列出mysql数据库中的所有数据库名。
sqoop import \
--connect jdbc:mysql://hadoop01.bgd01:3306/userdb \
--username root \
--password=123456 \
--table emp \
--target-dir /sqoopresult \
--num-mappers 1

查看导入结果
hdfs dfs -cat /sqoopresult/part-m-00000

2、MySQL表数据增量导入 HDFS

insert into emp values ('1206', 'itcast', 'java dev', 50000, 'AC');

sqoop import \
--connect jdbc:mysql://hadoop01.bgd01:3306/userdb \
--username root \
--password=123456 \
--table emp \
--target-dir /sqoopresult \
--num-mappers 1 \
--incremental append \
--check-column id \
--last-value 1205

查看导入结果
hdfs dfs -cat /sqoopresult/part-m-00001

3、MySQL表数据导入Hive

sqoop import \
--connect jdbc:mysql://hadoop01.bgd01:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table itcast.emp_add_sp \
--create-hive-table  \
--hive-import \
--num-mappers 1

4、MySQL表数据子集导入 

1) “--where”参数进行数据过滤
sqoop import \
--connect jdbc:mysql://hadoop01.bgd01:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--where "city='sec-bad'" \
--target-dir /wherequery \
--num-mappers 1

2) “--query”参数进行数据过滤
sqoop import \
--connect jdbc:mysql://hadoop01.bgd01:3306/userdb \
--username root \
--password 123456 \
--query 'select id, name, deg from emp where id > 1203 and $CONDITIONS' \
--target-dir /wherequery2 \
--num-mappers 1

四、Sqoop 数据导出

在 userdb 数据库,使用文件 emp_export.sql 创建张表 emp_export

进入data目录创建一个名为emp_export.sql的文件
在里面填写Mysql的相关代码,代码如下:
use userdb;

DROP TABLE IF EXISTS `emp_export`; 
CREATE TABLE emp_export ( 
	id int(11) NOT NULL, 
	name varchar(100) DEFAULT NULL, 
	deg varchar(100) DEFAULT NULL,
	salary int(11) DEFAULT NULL, 
	dept varchar(10) DEFAULT NULL,
	PRIMARY KEY (id)
);

启动Mysql,执行如下指令:
MariaDB [(none)]>  source emp_export.sql

将 HDFS 上目录 /sqoopresult 下的part-m-00000 文件导出到数据库userdb的emp_export中

sqoop export \
--connect jdbc:mysql://hadoop01.bgd01:3306/userdb \
--username root \
--password=123456 \
--table emp_export \
--export-dir /sqoopresult \
--num-mappers 1

参考书籍

《Hadoop大数据技术原理与应用》

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨诺风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值