Sqoop入门笔记-----架构以及应用介绍

本篇文章在具体介绍Sqoop之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Sqoop在业务当中的实际地位。

如上图所示:在实际的业务当中,我们首先对原始数据集通过MapReduce进行数据清洗,然后将清洗后的数据存入到Hbase数据库中,而后通过数据仓库Hive对Hbase中的数据进行统计与分析,分析之后将分析结果存入到Hive表中,然后通过Sqoop这个工具将我们的数据挖掘结果导入到MySql数据库中,最后通过Web将结果展示给客户。

向大家展示完Hadoop业务开发流程之后,将进入到本篇文章的正题—-Sqoop架构以及应用的介绍。

(一)Sqoop架构介绍

1、Sqoop的概念

Sqoop:SQL–to–Hadoop

正如Sqoop的名字所示:Sqoop是一个用来将关系型数据库和Hadoop中的数据进行相互转移的工具,可以将一个关系型数据库(例如Mysql、Oracle)中的数据导入到Hadoop(例如HDFS、Hive、Hbase)中,也可以将Hadoop(例如HDFS、Hive、Hbase)中的数据导入到关系型数据库(例如Mysql、Oracle)中。如下图所示:

2、Sqoop架构

Sqoop架构:

正如上图所示:Sqoop工具接收到客户端的shell命令或者Java api命令后,通过Sqoop中的任务翻译器(Task Translator)将命令转换为对应的MapReduce任务,而后将关系型数据库和Hadoop中的数据进行相互转移,进而完成数据的拷贝。

(二)Sqoop应用介绍

Sqoop作为一个数据转移工具,必须要掌握其具体用法,下面将围绕Sqoop import to HDFS、增量导入、批脚本执行、Sqoop import to Hive、Sqoop import to Hbase、Sqoop export 几个方面进行介绍。

1、Sqoop import to HDFS

说明:

- -connect:指定JDBC的URL 其中database指的是(Mysql或者Oracle)中的数据库名

- -table:指的是要读取数据库database中的表名

- -username - -password:指的是Mysql数据库中的用户名和密码

- -target-dir:指的是HDFS中导入表的存放目录(注意:是目录)

- -fields-terminated-by :设定导入数据后每个字段的分隔符

-m:并发的map数量

- -null-string:导入的字段为空时,用指定的字符进行替换

- -incremental append:增量导入

- -check-column:指定增量导入时的参考列

- -last-value:上一次导入的最后一个值

下面给大家举一个例子进行相应说明:对于Mysql数据库,将hive数据库中的consumer表通过sqoop导入到HDFS中

shell命令:

sqoop import --connect     jdbc:mysql://hadoop80:3306/hive     --table  consumer                --username root --password  admin    --target-dir /outdir/  --fields-terminated-by ‘\t‘  -m 1 

运行结果如下图所示:

通过Sqoop这个工具就将我们Mysql数据库中的数据导入到了HDFS中,上面的shell命令类似我们下面的shell操作:

hadoop jar   copy.jar   mysql://hadoop80:3306/hive/consumer  /outdir/

2、增量导入

在实际的工作当中都是数据库的表中数据不断增加的,比如刚才的consumer表,因此每次导入的时候只想导入增量的部分,不想将表中的数据在重新导入一次(费时费力),即如果表中的数据增加了内容,就向Hadoop中导入一下,如果表中的数据没有增加就不导入—–这就是增量导入。

- -incremental append:增量导入

- -check-column:(增量导入时需要指定增量的标准—哪一列作为增量的标准)

- -last-value:(增量导入时必须指定参考列—–上一次导入的最后一个值,否则表中的数据又会被重新导入一次)

以刚才的consumer表为例,我们向consumer表中增加两条记录,如下图所示:

shell的增量操作:

sqoop import --connect     jdbc:mysql://hadoop80:3306/hive     --table  consumer                --username root --password  admin    --target-dir /outdir/  --fields-terminated-by ‘\t‘  -m 1   --incremental append  --check-column  id  --last-value  4

增量导入的结果如下图所示:

从运行结果可以看出,输出结果多了一个part-m-00001,而该文件中所包含的内容为:

文件中的内容正是刚刚我们新增加的两条记录。

3、批量导入

从上面导入的命令可以看出,命令行包含的命令太多了,太麻烦了,因此如果类似的作业太多的话,我们应该将其设置为一个作业,做成一个脚本文件。

创建批脚本作业的shell命令:

sqoop   job  --create   job001 --    import --connect     jdbc:mysql://hadoop80:3306/hive                       --table  consumer         --username root --password  admin    --target-dir    /outdir/                                  --fields-terminated-by ‘\t‘  -m 1 

通过sqoop job –list可以查看生成的批脚本文件:

通过sqoop job –exec 即可运行我们刚才生成的脚本文件,将我们Mysql数据库中的consumer表中的数据导入到HDFS中,而不需要每次都写很长的命令来运行。

4、Sqoop import to hive

说明:

- -connect:指定JDBC的URL 其中database指的是(Mysql或者Oracle)中的数据库名

- -table:指的是要读取数据库database中的表名

- -username - -password:指的是Mysql数据库中的用户名和密码

- -hive-import 指的是将数据导入到hive数据仓库中

- -create-hive-table 创建表,注意:如果表已经存在就不用写这个命令了,否则会报错

- -hive-table 指定databasename.tablename (哪个数据库中的哪个表)

- -fields-terminated-by :设定导入数据后每个字段的分隔符

-m:并发的map数量

- -null-string:导入的字段为空时,用指定的字符进行替换

- -incremental append:增量导入

- -check-column:指定增量导入时的参考列

- -last-value:上一次导入的最后一个值

同样,下面给大家举一个例子进行相应的说明:对于Mysql数据库,将hive数据库中的consumer表通过sqoop导入到Hive数据仓库中

shell命令操作:

sqoop import --connect jdbc:mysql://hadoop80:3306/hive  --table consumer     --username root --password admin --hive-import  --create-hive-table  --hive-table d1.table1                  --fields-terminated-by  ‘\t‘  -m 1

运行结果如下图所示:

通过Sqoop这个工具就将我们Mysql数据库中的数据导入到了Hive数据仓库中,上面的shell命令类似我们下面的shell操作:

hadoop jar copy.jar  mysql://hadoop80:3306/hive/consumer  /hive/d1.table1

即本质上通过sqoop这个工具完成的就是一个数据的拷贝工作。

注:如果我们对sqoop import to hive不熟悉的话,我们可以先将数据库中的数据导入到HDFS的指定目录下,然后在Hive中创建一个外部表关联这个指定目录即可。

5、Sqoop import to hbase

说明:

- -connect:指定JDBC的URL 其中database指的是(Mysql或者Oracle)中的数据库名

- -table:指的是要读取数据库database中的表名

- -username - -password:指的是Mysql数据库中的用户名和密码

- -hbase-create-table:表示在hbase中建立表

- -hbase-table A:指定在hbase中建立表A

- -column-family infor:表示在表A中建立列族infor。

- -hbase-row-key :表示表A的row-key是consumer表的id字段

-m:并发的map数量

- -null-string:导入的字段为空时,用指定的字符进行替换

- -incremental append:增量导入

- -check-column:指定增量导入时的参考列

- -last-value:上一次导入的最后一个值

下面给大家举一个例子进行相应的说明:对于Mysql数据库,将hive数据库中的consumer表通过sqoop导入到Hbase中:

shell命令:

 sqoop import --connect jdbc:mysql://hadoop80:3306/hive  --table consumer    --username root --password admin    --hbase-create-table     --hbase-table A      --column-family infor                      --hbase-row-key id --fields-terminated-by ‘\t‘  -m 1

运行结果如下:

通过Sqoop这个工具就将我们Mysql数据库中的数据导入到了Hbase中,上面的shell命令类似我们下面的shell操作:

hadoop jar copy.jar  mysql://hadoop80:3306/hive/consumer  /hbase/A

5、Sqoop export

下面给大家举一个例子进行相应的说明:假设将HDFS中的t1表通过sqoop导入到Mysql中的consumer表(事先必须存在):

HDFS中t1表的内容:

MySql中已经创建好的consumer表:

shell命令如下:

 sqoop export --connect jdbc:mysql://hadoop80:3306/hive  --table consumer   --username  root --password admin  --export-dir  /outdir/  --fields-terminated-by ‘\t‘  -m 1

运行结果,数据从HDFS的t1文件中成功的导入到了Mysql中的consumer表中:

注:从Hadoop向数据库中导入数据时,数据库中相应的表事先必须创建好。

(三)总结

Sqoop作为一个用来将关系型数据库和Hadoop中的数据进行相互转移的工具,对于我们来说更重要的在于灵活的运用这个工具。

如有问题,欢迎留言。

时间: 2024-10-13 20:53:53

Sqoop入门笔记-----架构以及应用介绍的相关文章

Hive入门笔记-----架构以及应用介绍

Hive这个框架在Hadoop的生态体系结构中占有及其重要的地位,在实际的业务当中用的也非常多,可以说Hadoop之所以这么流行在很大程度上是因为Hive的存在.那么Hive究竟是什么,为什么在Hadoop家族中占有这么重要的地位,本篇文章将围绕Hive的体系结构(架构).Hive的操作.Hive与Hbase的区别等对Hive进行全方面的阐述. 在此之前,先给大家介绍一个业务场景,让大家感受一下为什么Hive如此的受欢迎: 业务描述:统计业务表consumer.txt中北京的客户有多少位?下面是

Hbase入门笔记----架构以及应用介绍

Hbase全称为Hadoop Database,即Hbase是Hadoop的数据库,是一个分布式的存储系统.Hbase利用Hadoop的HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理Hbase中的海量数据.利用zookeeper作为其协调工具. 本篇文章将重点介绍Hbase三个方面的内容:Hbase体系结构(架构)的介绍.Hbase shell的操作.Hbase的Java api的客户端操作. (一)Hbase的架构介绍 Hbase的体系结构是一个主从式的结构,主节点Hm

Flume入门笔记------架构以及应用介绍

在具体介绍本文内容之前,先给大家看一下Hadoop业务的整体开发流程: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步,从而引出我们本文的主角-Flume.本文将围绕Flume的架构.Flume的应用(日志采集)进行详细的介绍. (一)Flume架构介绍 1.Flume的概念 flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到图中的HDFS,简单来说flume就是收集日志的. 2.

redis入门笔记(2)

redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,这是相对memcache来说的一个大的优势.redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式. Snapshotting        快

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持 调试(debug)是软件开发的一个重要环节,对于嵌入式开发而言这个环节其实比较依赖一些硬件资源(硬件debugger)的支持.传统的嵌入式系统的调试比较依赖断点(breakpoint)和单步调试(single step through).而 ARM cortex-M 系列的芯片其实有很强的CoreSight片上调试支持,实际上就是一个小的调试硬件,作为ARM的标准,内嵌在ARM的芯片里.在ARM自家的调试器ULINK-pro等的帮

二、OpenStack入门 之 架构分析

OpenStack入门 之 架构分析 写在前面 学习目标: 了解 OpenStack 各组件的逻辑关系: 了解 OpenStack 的各组件的通信和部署关系: 了解 OpenStack 的工作流程: 接下来我会掌握: OpenStack 组件间的逻辑关系: OpenStack 的API: OpenStack 组件间的通信关系: OpenStack 中几种不同的存储: OpenStack 工作流程: OpenStack 的部署架构: OpenStack 各组件之间的关系有:逻辑关系,通信关系,部署

MySQL入门笔记(一)

MySQL入门笔记(二) 一.数据类型 1. 整型 2. 浮点型 3. 字符型 4. 日期时间型 二.数据库操作 1. 创建库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name; ??上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内的参数为任选其一): ??添加IF NOT EXISTS的作用则是,若新建数据库的名称与已有数据库名称冲突,则产

JAVA数据库编程(JDBC技术)-入门笔记

本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学习一下.我现在很迫不及待用JAVA想来实现以下对数据库的增删改查.想实现就来看Java是怎么操作数据库的,回想下.Net里你可能会配置web.Config,或者你去写一些DBhelper类然后调用里面的自己定义的一些增删改查的方法,更或者你去配一些数据控件等等往往发现操作基本都是一体化的简单.现在面

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二)

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二) RTX的进程间通讯主要依赖于四种机制,分别是事件(Event),互斥锁(Mutex),旗语或信号量(Semaphore),和邮箱(Mailbox).前三种机制侧重进程间的同步,邮箱则侧重进程间的数据通讯.这次讲一下信号量和邮箱. 1.信号量(Semaphore) 1.简介 信号量其实是一个很抽象的操作系统原语,它最早由荷兰计算机科学家Dijkstra提 出,用于解决多项资源的分配问题.实际上信号量的适用范围非常广,可以很好地解决很