Sqoop 安装配置、指令介绍【导入、导出】


Sqoop 原理

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

如下是 Sqoop 工作流程图:
在这里插入图片描述
通过客户端 CLI(命令行界面)方式或者 Java API 的方式调用 Sqoop 工具, Sqoop 可以将指令转换为对应的 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 安装

Sqoop1.4.6 下载地址

下载好之后解压到目录

 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /usr/

2.Sqoop配置

首先进入到 Sqoop 解压包目录中的 conf 目录下,将 sqoop-env-template.sh 模板文件复制重命名为 sqoop-env.sh ,然后对文件当中的内容进行如下图修改:
在这里插入图片描述
在 sqoop-env.sh 配置文件中,需要配置的是 Sqoop 运行时必备环境的安装目录,Sqoop 运行在 Hadoop 之上,因此必须有 Hadoop 的环境。另外,在配置文件中还需要根据需要自定义配置 Hbase、Hive 和 Zookeeper 等环境变量。

为了方便管理操作 Sqoop ,需要配置环境变量。

vim /etc/profile
# 加入下面内容
export SQOOP_HOME=/usr/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
-----------------------------------
# 生效环境变量
source /etc/profile

完成 Sqoop 的相关配置后,还需要根据所操作的关系数据库添加对应的 JDBC 驱动包,用于数据库连接。本篇文章将针对 MySQL 数据库进行数据库迁移操作,所以需要将 mysql-connector-java-5.1.47-bin.jar(版本的问题自行选择)上传至 Sqoop 解压目录的 lib 目录下。


3.执行效果测试

执行完上述 Sqoop 的安装配置操作后,就可以执行 Sqoop 相关的指令来验证 Sqoop 的执行效果了,具体指令如下(注意:在 Sqoop 的解压包目录下执行,同时需要注意数据库密码)。

sqoop list-databases \
-connect jdbc:mysql://localhost:3306/ \
--username root --password 123456

注意:本条指令中,sqoop list-database 用于输出连接的是本地 MySQL 数据库中的所有数据库名,如果正确的返回指定的地址的 MySQL 数据库信息,那么说明 Sqoop 配置完毕。

在这里插入图片描述
如上图所示,通过 Sqoop 指令来查询 MySQL 数据库,同样可以进入到 MySQL 中查询数据库进行验证。
在这里插入图片描述



Sqoop指令介绍

Sqoop 工具操作简单,它提供了一系列的工具指令,用来进行数据库的导入、导出操作等。可以使用 bin 目录下的 sqoop help 指令来查看 Sqoop 支持的所有工具指令,如下图所示。(配置过环境变量后可以直接使用该命令。)

在这里插入图片描述
上图就是 Sqoop 支持的所有工具命令,并且对应有英文解释说明。其中,包含了常用的导入(import)、导出(export)、显示所有数据库名称(list-databases)和显示所有表(list-tables)等。

通过 sqoop help command 可以查看该指令的各种参数,比如查看 import 命令的参数,可以使用 sqoop help import
如下图结果:
在这里插入图片描述

注意:在执行 Sqoop 指令进行操作时可以指定 通用参数(Common arguments)特定参数 。通用参数主要用于对关系数据库的连接配置,而特定参数主要用于对 Sqoop 的具体操作实现进行功能配置,并且通用参数必须位于特定参数之前。



Sqoop 数据导入(import)

Sqoop 数据导入(import)是将关系数据库中的单个表数据导入到 HDFS 和 Hive 等具有 Hadoop 分布式存储结构的文件系统中,表中的每一行都视为一条记录,所有记录默认以文本文件格式进行逐行储存,还可以以二进制行书储存,如 Avro 文件格式和序列文件格式(SequenceFile)。

下面来演示 Sqoop 数据导入、导出的相关操作,首先进入 Master 主机中的 mysql ,并且创建 userdb 数据库,字符集设置为 UTF-8,然后使用该数据库。

create database userdb character set utf8 collate utf8_general_ci;
use userdb;

下面是创建数据库表的脚本。

 1	----------------------------
 2	--Table structure for `emp`
 3	----------------------------
 4	DROP TABLE IF EXISTS `emp`;
 5	CREATE TABLE `emp` (
 6	`id` int(11) NOT NULL,
 7	`name` varchar(100) DEFAULT NULL,
 8	`deg` varchar(100) DEFAULT NULL,
 9	`salary` int(11) DEFAULT NULL,
10	`dept` varchar(10) DEFAULT NULL,
11	PRIMARY KEY (`id`)
12	);
13	----------------------------
14	--Records of emp
15	----------------------------
16	INSERT INTO `emp` VALUES('1201','gopal','manager','50000','TP');
17	INSERT INTO `emp` VALUES('1202','manisha','Proof reader','50000','TP');
18	INSERT INTO `emp` VALUES('1203','khalil','php dev','30000','AC');
19	INSERT INTO `emp` VALUES('1204','prasanth','php dev','30000','AC');
20	INSERT INTO `emp` VALUES('1205','kranthi','admin','20000','TP');
21	----------------------------
22	--Table structrue for `emp_add`
23	----------------------------
24	DROP TABLE IF EXISTS `emp_add`;
25	CREATE TABLE `emp_add` (
26	`id` int(11) NOT NULL,
27	`hno` varchar(100) DEFAULT NULL,
28	`street` varchar(100) DEFAULT NULL,
29	`city` varchar(100) DEFAULT NULL,
30	PRIMARY KEY(`id`)
31	);
32	----------------------------
33	--Records of emp_add
34	----------------------------
35	INSERT INTO `emp_add` VALUES('1201','288A','vgiri','jublee');
36	INSERT INTO `emp_add` VALUES('1202','108I','aoc','sec-bad');
37	INSERT INTO `emp_add` VALUES('1203','144Z','pgutta','hyd');
38	INSERT INTO `emp_add` VALUES('1204','78B','old city','sec-bad');
39	INSERT INTO `emp_add` VALUES('1205','720X','hitec','sec-bad');
40	----------------------------
41	--Table structrue for `emp_conn`
42	----------------------------
43	DROP TABLE IF EXISTS `emp_conn`;
44	CREATE TABLE `emp_conn` (
45	`id` int(100) NOT NULL,
46	`phno` varchar(100) DEFAULT NULL,
47	`email` varchar(100) DEFAULT NULL,
48	PRIMARY KEY(`id`)
49	);
50	----------------------------
51	--Records of emp_conn
52	----------------------------
53	INSERT INTO `emp_conn` VALUES('1201','2356742','[email protected]');
54	INSERT INTO `emp_conn` VALUES('1202','1661663','[email protected]');
55	INSERT INTO `emp_conn` VALUES('1203','8887776','[email protected]');
56	INSERT INTO `emp_conn` VALUES('1204','9988774','[email protected]');
57	INSERT INTO `emp_conn` VALUES('1205','1231231','[email protected]');

然后在 userdb 数据库当中执行脚本:

source /root/userdb.sql

souce + 脚本位置

结果如下:
在这里插入图片描述


MySQl 表数据导入 HDFS(报错)

将 MySQL 表数据导入到 HDFS 中,具体指令示例如下(读者在演示时需要注意更新参数值,另外“ \ ”符号用于单个指令换行)。

sqoop import \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult \
--table emp \
--num-mappers 1
参数 含义
–connect 指定连接的关系数据库,包括 JDBC 驱动名、主机名、端口号和数据库名称。应注意的是,Sqoop 数据导入导出操作需要启动 Hadoop 集群的 MapReduce程序,所以这里应该注意的是,Sqoop 数据导入导出操作需要启动 Hadoop 集群的 MapReduce 程序,所以这里连接的主机名不能是 localhost,必须是 MySQL 数据库所在的主机名或 IP 地址。
–username 用于指定连接数据库的用户名
–password 用于指定连接数据库的密码。这种方式直接暴露了数据库连接密码,不太安全,所以可以使用 -P 指令代替,这个指令会以交互方式提示用户输入密码。
–target-dir 指定导入到 HDFS 的目录,代表 MySQL 数据表要导入 HDFS 的目标地址。这里需要注意该选项所指定的目录的最后一个子目录不能存在,否则 Sqoop 会执行失败。
–table 代表要进行数据导入操作的 MySQL 源数据库表名
–num-mappers 指定map任务个数(默认为4个,并且会产生4个结果文件),可简写为-m。这里指定 map 任务个数为1,那么只会启动一个 Map 程序执行相关操作,并只会生成一个结果文件

增量导入

当 MySQL 表中的数据发生了新增或修改变化,需要更新 HDFS 上对应的数据时,就可以使用 Sqoop 的增量导入功能。Sqoop 目前支持俩种增量导入模式:append 模式 和 lastmodified 模式。其中,append 模式主要针对UPDATE修改数据的增量导入。

在进行增量导入操作时,首先必须指定“–check-column”参数,用来检查数据表列字段,从而确定哪些数据需要执行增量导入。例如,在执行 append 模式增量导入时,通常会将“–check-column”参数指定为具有连续自增功能的列(如主键id);而执行 lastmodified 模式增量导入时通常会将“–check-column”参数必须指定为日期时间类型的列(如 date 或 timestamp 类型的列)。

同时,还可以为增量导入操作指定“–last-value”参数,只用于增量导入 last-value 值以后的记录数据,然后存储到之前 HDFS 上相应目录下的一个单独文件中。

增量导入演示,为了验证增量导入功能,首先得修改数据库的中表数据,从而和 HDFS 上的数据不一样。

INSERT INTO `emp` VALUES ('1206','dkl','java dev','50000','AC');

然后,针对 emp 表数据的新增变化执行 append 模式的增量导入,指令如下。

sqoop import \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult \
--table emp \
--num-mappers 1 \
--incremental append \
--check-colum id \
--last-values 1205 

这条指令和上述一样,只是为了实现增量导入功能,新加了3个参数。其中,“–incremental append ” 指定了使用增量导入的模式为 append;“–check-colum id” 指定了针对 id 值为 1205 以后的数据执行增量导入。


MySQL 表数据导入 Hive

指令如下:

sqoop import \
--connect jdbc://master:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table dkl.emp_add_sp \
--create-hive-table \
--hive-import \
--num-mappers 1

上述指令 “–hive-table dkl.emp_add_sp” 用于指定上传到 Hive 上的目标地址为 dkl 数据仓库的 emp_add_sp 表中,这里必须前提创建对应的 dkl 数据仓库;“–create-hive-table” 用于指定自动创建指定的目标 Hive 表(即 emp_add_sp 表),如果表已经存在,则执行失败;“–hive-import” 用于将对应的 MySQL 表(即 emp_add 表)导入 Hive 中进行数据映射。



Sqoop 数据导出

Sqoop 书v就导出也就是将 HDFS、Hive、Hbase 等文件系统或者数据仓库中的数据导出到关系数据库中,在导出操作之前,目标表必须存在于目标数据库当中,否则在执行导出操作时会失败。而 Hive 和 Hbase 的数据通常都是以文件的形式储存在 HDFS 中,因此,本节就重点讲解如何将 HDFS 数据导出到 MySQL 中。

Sqoop 将 HDFS 上的文件导出至 MySQL

执行 emp_export.sql 脚本文件,进行创建目标表结构,而且该表结构需要和 HDFS 中的源数据结构类型一致。如下所示:

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`)
);

完成上面目标表 emp_export 的创建工作后,接下来就将 HDFS 上/sqoopresult 目录下的 part-m-00000 文件进行导出操作,指令如下:

sqoop export \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--table emp_export \
--export-dir /sqoopresult

注意:上述导出指令和导入指令基本相同,有区别的是导入目录参数 “-target-dir” 改为导出目录参数 “–export-dir” 。

Sqoop官方文档

猜你喜欢

转载自blog.csdn.net/shuyv/article/details/114971037
今日推荐