Sqoop 数据迁移工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_1018944104/article/details/84573614

目录

1.概述

2.工作机制

3.Sqoop安装

4.Sqoop基本命令介绍

5.Sqoop数据导入

5.1.导入MySQL数据到HDFS

5.1.1.普通导入

5.1.2.指定分隔符和导入路径

5.1.3.导入where条件数据

5.1.4.导入Query结果数据

5.2.导入MySQL数据到Hive

5.2.1.普通导入

5.2.2.增量导入

5.3.导入MySQL数据到HBase

6.Sqoop数据导出

6.1.导出HDFS数据到MySQL

6.2.导出Hive数据到MySQL

6.3.导出HBase数据到MySQL

7.Sqoop导入导出的原理剖析

7.1.Sqoop导入原理

7.2.Sqoop导出原理

8.资料


1.概述

sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。

导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等

Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。

2.工作机制

本质上是将sqoop的命令转换为MR任务,并自定义输入/输出,而且只需要maptask就可以完成。

数据导入时,map端的数据来源是关系型数据库,由DBInputFormat类读取,一条数据一条数据读取,将数据直接写到hadoop平台就可以了。和自己前面写MR相比,相当于自定义了数据输入(关系型数据库的输入)。

数据导出时,map端数据来源是大数据平台,一条数据一条数据读取,将数据写出到关系型数据库,由DBOutputFormat类写出,相当于自定义了输出。

3.Sqoop安装

安装 Sqoop 的前提是已经具备 Java 和 Hadoop 的环境。

安装包下载地址 http://ftp.wayne.edu/apache/sqoop/1.4.6/
安装包:sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz

安装步骤

1.准备安装包 sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz

2.解压安装包到安装目录
tar -zxvf sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz -C apps/
cd apps
mv sqoop-1.4.6.bin_hadoop-2.0.4-alpha/ sqoop-1.4.6

3.进入到 conf 文件夹,找到 sqoop-env-template.sh,修改其名称为 sqoop-env.sh
cd conf
mv sqoop-env-template.sh sqoop-env.sh

4.修改 sqoop-env.sh

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.5
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.5
export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6
export HIVE_HOME=/home/hadoop/apps/apache-hive-1.2.1-bin
export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
zookeeper 和 hbase 没有安装。那就不用管了。如果也安装的有,并且要使用,那么就给配置上。

5. 加入 mysql 驱动包到 sqoop1.4.6/lib 目录下
cp mysql-connector-java-5.1.40-bin.jar ~/apps/sqoop1.4.6/lib/

6.配置系统环境变量
vi ~/.bashrc
然后输入:
export SQOOP_HOME=/home/hadoop/apps/sqoop1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
然后保存退出
source ~/.bashrc

7.验证安装是否成功
sqoop-version 或者 sqoop version

8.出现如图所示画面,证明安装成功,那么接下来就可以正常使用了。

4.Sqoop基本命令介绍

首先,我们可以使用 sqoop help 来查看,sqoop 支持哪些命令

然后得到这些支持了的命令之后,如果不知道使用方式,可以使用 sqoop command 的方式来查看某条具体命令的使用方式,比如:sqoop help import

5.Sqoop数据导入

“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)。

下面的语法用于将数据导入 HDFS
sqoop import (generic-args) (import-args)

常用参数:

示例:

先看 Mysql 表数据:这是 mysql 中 help_keyword 表的数据

5.1.导入MySQL数据到HDFS

5.1.1.普通导入

sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
-m 1

如果我们没有给该命令指定导出的文件的存储路径,那么默认会保存在 HDFS 上的 /user/hadoop/help_keyword 目中。其中,第一个 user 是固定的,第二个 hadoop,表示链接的用户名,第三个表示表名。

查看结果:
执行过程结果:

HDFS 上文件结果:

可以下载下来使用本地文本编辑器查看比对结果(文件内容结果)

也可以使用 hadoop 命令查看:hadoop fs -cat /user/hadoop/help_keyword/part-m-00000

从以上结果可以得出一个结论:如果没有指定路径,则会按默认规则生成路径,如果没有指定分隔符,默认按照逗号分隔。

5.1.2.指定分隔符和导入路径

先看指定导入路径的语法规则:
--target-dir <new or exist directory in HDFS>

再看指定导入的文本文件的列分隔符:
--fields-terminated-by '\t'

看具体实例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/my_help_keyword \
--fields-terminated-by '\t' \
-m 1

看结果:

hadoop fs -cat /user/hadoop/my_help_keyword/part-m-00000

5.1.3.导入where条件数据

我们可以导入表的使用 Sqoop 导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。

where 子句的语法如下。
--where <condition>

下面我们看具体实例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--where "name='STRING' " \
--table help_keyword \
--target-dir /sqoop/hadoop/myoutport1 \
-m 1

看执行结果:

看导出的文本结果:
hadoop fs -cat /sqoop/hadoop/myoutport1/part-m-00000

5.1.4.导入Query结果数据

sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--target-dir /user/hadoop/myimport2 \
--query 'select help_keyword_id,name from help_keyword WHERE name = "STRING" and 
$CONDITIONS' \
--split-by help_keyword_id \

--fields-terminated-by '\t' \
-m 1
注意:外层使用单引号,SQL 语句当中的条件使用双引号,否则会报错或者这么写:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--target-dir /user/hadoop/myimport22 \
--query "select help_keyword_id,name from help_keyword WHERE name = 'STRING' and 
\$CONDITIONS" \
--split-by help_keyword_id \

--fields-terminated-by '\t' \
-m 1

查看执行结果:

5.2.导入MySQL数据到Hive

Sqoop 导入关系型数据到 hive 的过程是先导入到 hdfs,然后再 load 进入 hive。

5.2.1.普通导入

示例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hive-import \
-m 1
注意:导入数据到 hive 表,默认表在 default 库下,表名一样,采用'\u0001'分隔
查看执行结果:

查看结果,确实生成结果在 hive 的 default 库中,查看表数据:
hive> select * from help_keyword limit 3;

接下来,再看一例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--hive-table mydb_test.new_help_keyword \
--delete-target-dir

注意:表会自动创建,但是库不会。所以在执行该语句之前,一定要确保 hive 的数据库mydb_test 是存在的,否则程序会报错

查看执行结果:

5.2.2.增量导入

增量导入是仅导入表中新添加的行的技术。
它需要添加 'incremental' , 'check-column', 和 'last-value' 选项来执行增量导入。
下面的语法结构用于 Sqoop 导入命令增量选项。
--incremental <mode>
--check-column <column name>
--last value <last check column value>

下面的命令执行增量导入:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/myimport3 \
--incremental append \
--check-column help_keyword_id \
--last-value 500 \

-m 1
此处结果不包含 help_keyword_id = 500 数据,数据是大于 500 的

查看执行结果:

 

5.3.导入MySQL数据到HBase

首先看示例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family person \
--hbase-row-key help_keyword_id

字段解释:
--connect jdbc:mysql://hadoop04:3306/mysql 表示远程或者本地 Mysql 服务的 URI
--hbase-create-table 表示在 HBase 中建立表。
--hbase-table new_help_keyword 表示在 HBase 中建立表 new_help_keyword。
--hbase-row-key help_keyword_id 表示hbase表的rowkey是mysql表的help_keyword_id字段。
--column-family person 表示在表 new_help_keyword 中建立列族 person。
--username 'root' 表示使用用户 root 连接 mysql。
--password 'root' 连接 mysql 的用户密码
--table help_keyword 表示导出 mysql 数据库的 help_keyword 表。

看结果:

6.Sqoop数据导出

6.1.导出HDFS数据到MySQL

注意:导出前,目标表必须存在于目标数据库中

HDFS:hadoop distributed file system
RDBMS:Relation DataBase Manager System
OOP:orentied object programming
AOP:orentied aspect programming

默认操作是从将文件中的数据使用 INSERT 语句插入到表中
更新模式下,是生成 UPDATE 语句更新表数据

Export 语法结构:
sqoop export (generic-args) (export-args)

Export 常用参数:

第一步,先看需要导出到 mysql 的数据:

然后第二步,需要首先在 mysql 数据库中新建表:

create database sqoopdb default character set utf8 COLLATE utf8_general_ci; 
use sqoopdb;
CREATE TABLE sqoopstudent ( 
 id INT NOT NULL PRIMARY KEY, 
 name VARCHAR(20), 
 sex VARCHAR(20),
 age INT,
department VARCHAR(20)
);

第三步,执行导出:
sqoop export \
--connect jdbc:mysql://hadoop02:3306/sqoopdb \
--username root \
--password root \
--table sqoopstudent \
--export-dir /sqoopdata \
--fields-terminated-by ','

查看结果:

注意:如果导出数据到 mysql 出现乱码,那么请参考这个解决方案

https://my.oschina.net/u/559635/blog/498990

6.2.导出Hive数据到MySQL

sqoop export \
--connect jdbc:mysql://hadoop02:3306/sqoopdb \
--username root \
--password root \
--table uv_info \
--export-dir /user/hive/warehouse/uv/dt=2011-08-03 \
--input-fields-terminated-by '\t'
其实跟直接导出 HDFS 数据到 MySQL 没什么两样

6.3.导出HBase数据到MySQL

很遗憾,现在还没有直接的命令将 HBase 的数据导出到 MySQL
一般采用如下 3 种方法:
1.将 Hbase 数据,扁平化成 HDFS 文件,然后再由 sqoop 导入
2.将 Hbase 数据导入 Hive 表中,然后再导入 mysql
3.直接使用 Hbase 的 Java API 读取表数据,直接向 mysql 导入,不需要使用 sqoop

7.Sqoop导入导出的原理剖析

7.1.Sqoop导入原理

从上面的演示例子中,我们大致能得出一个结论,sqoop 工具是通过 MapReduce 进行导入作业的。总体来说,是把关系型数据库中的某张表的一行行记录都写入到 hdfs

下面给大家奉上一张原理图:

上面这张图大致解释了 sqoop 在进行数据导入工作的大致流程,下面我们用文字来详细描述一下:
1.第一步,Sqoop 会通过 JDBC 来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。
2.第二步,这些数据库的数据类型(varchar, number 等)会被映射成 Java 的数据类型(String, int等),根据这些信息,Sqoop 会生成一个与表名同名的类用来完成序列化工作,保存表中的每一行记录。
3.第三步,Sqoop 启动 MapReducer 作业
4.第四步,启动的作业在 input 的过程中,会通过 JDBC 读取数据表中的内容,这时,会使用 Sqoop 生成的类进行反序列化操作
5.第五步,最后将这些记录写到 HDFS 中,在写入到 HDFS 的过程中,同样会使用 Sqoop 生成的类进行反序列化。

7.2.Sqoop导出原理

Sqoop 进行数据导出,总体也是基于 mapreduce 任务。

下面先看图:

详细文字描述:
1.第一步,sqoop 依然会通过 JDBC 访问关系型数据库,得到需要导出数据的元数据信息
2.第二步,根据获取到的元数据的信息,sqoop 生成一个 Java 类,用来进行数据的传输载体。该类必须实现序列化和反序列化
3.第三步,启动 mapreduce 作业
4.第四步,sqoop 利用生成的这个 java 类,并行的从 hdfs 中读取数据
5.第五步,每个 map 作业都会根据读取到的导出表的元数据信息和读取到的数据,生成一批 insert 语句,然后多个 map 作业会并行的向数据库 mysql 中插入数据。

所以,数据是从 hdfs 中并行的进行读取,也是并行的进入写入,那并行的读取是依赖 hdfs的性能,而并行的写入到 mysql 中,那就要依赖于 mysql 的写入性能嘞。

8.资料

Sqoop 详细可以参照我的博客:

http://blog.csdn.net/zhongqi2513/article/details/52777727

http://blog.csdn.net/zhongqi2513/article/details/53281255

当然最重要的是官网文档:

http://sqoop.apache.org/docs/

猜你喜欢

转载自blog.csdn.net/qq_1018944104/article/details/84573614
今日推荐