Sqoop数据迁移工具

Sqoop是Apache旗下的一款“Hadoop和关系数据库服务器之间传送数据”的工具。
比如:导入数据——MySQL,Oracle导入数据到Hadoop的Hdfs,Hive,HBase等数据存储系统;导出数据——从Hadoop的文件系统中导出数据到关系数据库MySQL等。

Sqoop的本质还是一个命令行工具。

工作机制
将导入或导出命令翻译成MapReduce程序来实现,在翻译出MapReduce中主要是对InputFormat和OutputFormat进行定制。

Sqoop的使用

Sqoop的基本命令:
Sqoop help查看:
Sqoop的基本命令
查看某个命令的用法(比如import):sqoop help import

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

数据导入HDFS的语法:sqoop import (generic-args) (import-args)
数据导入语法的常用参数

  • 导入MySQL数据到HDFS:
    普通导入:
    MySQL数据导入HDFS中普通导入方式
    这种方式,没有指定导出的文件的存储路径,那么就会默认存储在HDFS上的/user/hadoop/help_keyword目录中,其中,第一个user固定的,第二个Hadoop表示链接的用户名,第三个表示表明。
    其存储的文本文件,是MySQL表中每条记录对应一行,每一个字段之间默认用逗号分开的样式。
    也可以用Hadoop命令的方式查看文本:hadoop fs -cat /user/hadoop/help_keyword/part-m-00000

结论,在导入时,没有指定路径,则会按默认规则生成路径,如果没有指定分隔符,默认按照逗号分隔

那么如何指定分隔符和导入路径呢?
就是在上面的命令中加上:
–target-dir HDFS上的路径(/user/hadoop/my_help_keyword)
–field-terminated-by ‘\t’
即:
加上导入路径和分隔符
导入where条件数据
再导入数据的同时,我们可以使用where做相应的SQL查询,并将结果存储在HDFS的目标目录。
where的语法:–where “条件”
即:
加上where
导入Query(查询)数据结果
Query数据导入
导入MySQL到Hive
Sqoop导入关系型数据到Hive的过程是先导入到HDFS,然后再load进入Hive。
普通导入
导入MySQL到Hive
导入数据到Hive中,默认表在default库下,表名一样,采用’\u0001’分隔。
在这里插入图片描述
注意,表会自动创建,但是库是不会的。所以再执行该语句之前,一定要确保Hive的数据库mudb_test是存在的,否则程序会报错。

增量导入
增量导入是仅导入表中新添加的行的技术。
它需要添加:
增量导入
此处结果不包括help_keyword_id=500的数据,数据都是大于500的。

导入MySQL数据到HBase
MySQL导入HBase

数据导出
注意:导出前,目标表必须存在于目标数据库中。
默认操作是从将文件的数据使用INSERT语句插入到表中,更新模式下,是生成UPDATE语句更新表数据。
Export的语法:sqoop export (generic-args) (export-args)
export的主要参数

导出HDFS数据到MySQL
首先要先在MySQL中新建对应的表,
再执行:
HDFS导出到MySQL
导出Hive数据到MySQL
Hive导出到MySQL
跟导出HDFS中的数据到MySQL没什么两样。

导出HBase数据到MySQL
没有直接的命令将HBase的数据导出到MySQL
一般采取如下3种方法:

  • 将HBase数据,扁平化成HDFS文件,然后再由Sqoop导入;
  • 将HBase数据导入Hive表中,然后再导入MySQL;
  • 直接使用HBase的Java API读取表数据,直接向MySQL导入,不需要使用Sqoop。

Sqoop导入导出的原理

Sqoop的导入原理
Sqoop工具是通过MapReduce进行导入作业的。总体来说,是把关系型数据库中的某张表的一行行记录都写入到HDFS中。
导入原理图
1- Sqoop会通过JDBC来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。
2- 这些数据库的数据类型会被映射成Java的数据类型,根据这些信息,Sqoop会生成一个与表明同名的类用来完成序列化工作,保存表中的每一行记录。
3- Sqoop启动MapReduce作业。
4- 启动的作业在input的过程中,会通过JDBC读取数据表中的内容,这时,会使用Sqoop生成的类进行反序列化操作。
5- 最后将这些记录写到HDFS中,在写入到HDFS的过程中,同样会使用Sqoop生成的类进行反序列化。

Sqoop的导出原理
导出原理
1- Sqoop依然会通过JDBC访问关系型数据库,得到需要导出数据的元数据信息。
2- 根据获取到的元数据的信息,Sqoop生成一个Java类,用来进行数据的传输载体。该类必须实现序列化和反序列化。
3- 启动MapReduce作业。
4- Sqoop利用生成的这个Java类,并行的从HDFS中读取数据。
5- 每个Map作业都会根据读取到的导出表的元数据信息和读取到的数据,生成一批insert语句,然后多个Map作业会并行的向数据库MySQL中插入数据。
所以,数据是从HDFS中并行的进行读取,也是并行的进入写入,那并行的读取是依赖HDFS的性能,而并行的写入到MySQL中,那就要依赖于MySQL的写入性能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值