sqoop--数据库和hdfs之间的搬运工(代码片段)

traditional traditional     2023-05-01     223

关键词:

sqoop简介

sqoop是一款开源的工具,主要用于在hadoop和与传统的数据库之间进行的数据的传递,可以将一个关系型数据库中的数据导入到hadoop的hdfs中,也可以将hdfs的数据导入到关系型数据库中。sqoop的命名由来就是sql?to?hadoop,它的原理就是将导入或者导出命令翻译成MapReduce来实现,在翻译出的MapReduce中对inputformat和outputformat进行定制。

sqoop安装

安装sqoop首先要安装java和hadoop,当然我这里已经安装好了,大数据组件的安装很简单,可以参考我的其他博客。然后我们安装sqoop,这里我采用的是1.4.5版本的,目前sqoop有2.x版本,但是建议使用1.x。另外我使用的是cdh版本的,其实不光是sqoop,基本上所有大数据组件,个人学习的话,都建议使用cdh版本,会自动帮你规避掉很多问题。下载地址:http://archive.cloudera.com/cdh5/cdh/5/,可以去里面找任意的大数据组件。

技术图片

我这里已经安装好了,我们来看一下目录结构

技术图片

我们看到这和其他大数据组件的目录结构是类似的,都是里面带一个bin目录,当然hadoop还有sbin,如果只有bin没有sbin,那么可以认为是把sbin目录的内容合并到bin目录里面去了。然后是conf,配置文件存放的目录,docs是文档,lib则是一些jar包等等。

修改配置文件

cd到conf目录下,修改配置文件。

技术图片

首先修改sqoop-env.sh,但是我们发现没有这个配置文件,不过有一个template,所以要cp一份,然后将其他组件的HOME目录配进去

技术图片

如果没有的话就不需要配,比如我这里没有hbase,所以就不配了。配置哪些就支持哪些,不配的话也不影响其他功能的使用,只是在启动的时候会弹出一些警告。另外我们一会儿会通过sqoop导入导出mysql的数据,所以需要一个mysql的驱动包,这里直接去菜鸟教程里面下载即可,然后丢到lib目录里面即可。

我们可以通过一个命令查看,配置是否正确

技术图片

出现如下,说明配置成功。我们看到上面有一些警告,告诉我们有些东西没有配置,不过不影响我们其他功能的使用。

下面我们来连接一下mysql,注意:我们只是丢了一个mysql的驱动包进去,但是没有进行相关的配置,这就意味着我们需要在连接的时候指定。先来看看我的mysql能不能启动

技术图片

看到是可以连接的,下面我们来使用sqoop连接一下。

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

技术图片

我们看到mysql的数据库信息被打印了出来,证明连接成功

导入数据

在sqoop中,导入和导出的概念比较绝对。从非大数据集群(比如:RDBMS,关系型数据库)向大数据集群(hadoop,hive,hbase)中传输数据,叫做导入。相反叫做导出。

从RDBMS到HDFS

我们在mysql中创建一张表,然后写入一些数据,使用sqoop导入到hdfs中。

技术图片

创建db数据库,在db数据库中创建一张girl表,然后写入了6条数据。

然后我们就可以导入数据了,注意:导入是专门指从数据库到hdfs,反过来的话叫做导出。导入有以下几种方式:

全部导入

在linux中如果命令比较长,但是你又想换行执行,那么只需要在结尾加一个即可
为什么要说这个,因为我们这里的命令就比较长

sqoop import --connect jdbc:mysql://localhost:3306/db --username root --password 密码 --table girl --target-dir /user/db --delete-target-dir --num-mappers 1 --fields-terminated-by "	"

解释:
sqoop import,表示导入,如果是从hdfs到mysql呢?对叫导出,是export
--connect,还是jdbc驱动连接,不同的是这次我们指定了数据库
--username 用户名
--password 密码
--table 导mysql的哪张表
--target-dir 导入到hdfs那个目录下,没有会创建
--delete-target-dir 如果--target-dir指定的目录存在,则删除,生产上这个选项不要加,存不存在可以实现校验一下
--num-mappers mapper运行计算数量
--fields-terminated-by 分隔符

下面我们就来试一下。

技术图片

此时我的hdfs上面目前只有一个tmp目录,我们执行之后看看会不会多出一个/user目录

技术图片

截取一部分,显然命令执行成功了。我们来看一下hdfs目录

技术图片

多了一个user目录,当然点进去还有个db目录,再进去就能看到文件了,还可以下载。

查询导入

我们上面的全部导入是把整张表都导入进去了,而显然查询导入是用来指定被导入的记录的。

sqoop import --connect jdbc:mysql://localhost:3306/db --username root --password 密码 --target-dir /user/db --delete-target-dir --num-mappers 1 --fields-terminated-by "	" --query 'select id, name, age, gender from girl where id <=3 and $CONDITIONS'

我们发现可以最后面指定一个--query,也就是查询语句,要查询的指定记录插入到hdfs中
而且我们还看到--table已经没有了,因为--query中已经指定了
但是查询语句的where中有一个$CONDITIONS,这是干什么的
我们注意一下这个--num-mappers参数,如果记录比较多的话,我们会指定多个mappers
但是我们希望从mysql导入到hdfs中,顺序是保持一致的。所以sqoop要求是加上这个$CONDITIONS的,否则报错

技术图片

导入成功

导入指定列

其实这个导入指定列,通过上面的查询导入是完全可以实现的,只不过sqoop也单独支持了另外的方式来导入列。

sqoop import --connect jdbc:mysql://localhost:3306/db --username root --password zgghyys123 --target-dir /user/db --delete-target-dir --num-mappers 1 --fields-terminated-by "	" --columns id,name --table girl

如果指定了--xxx,那么顺序是无所谓的,但如果不指定,则必须按照指定的顺序,这个指定的顺序可以去sqoop官网去查
但是个人建议还是指定一下,这样不会因为顺序的问题而出错
另外指定列的时候,多个列之间使用逗号分割,并且逗号前后不能有空格

技术图片

指定条件导入

sqoop import --connect jdbc:mysql://localhost:3306/db --username root --password 密码 --target-dir /user/db --delete-target-dir --num-mappers 1 --fields-terminated-by "	" --columns id,name --table girl
--where "id=1"

只导入id=1的,我们发现条件可以单独写在--where里面,其实--query可以看做是--columns和--where的组合
但是一旦指定了--columns、--where就不可以再指定--query了,会报错的,因为冲突了

从RBDMS到HIVE

sqoop import --connect jdbc:mysql://localhost:3306/db --username root --password 密码 --table girl --num-mappers 1 --fields-terminated-by "	" --hive-import --hive-overwrite --hive-table hive_girl

解释
--hive-import 其实到hive里面分为两步,第一步还是导入到hdfs,然后迁移到hive
--hive-overwrite,覆盖
--hive-table 导入到hive的哪张表

技术图片

我们注意到:此时hive里面是没有任何表的。然后我们执行上面的命令,但是却报错了,我们定位一下

技术图片

显示我们没有正确设置HIVE_CONF_DIR,显然这是不存在的。解决的办法是:将$HIVE_HOME/lib/hive-exec-**.jar拷贝到sqoop的lib目录里面去。

技术图片

然后重新执行

技术图片

执行成功,而且显示的信息分为两步,一个是导入hdfs,然后是迁移到hive。下面看看表有没有被创建

技术图片

我们看到表已经被创建了,而且记录也是一样的

导出数据

导出数据,从hdfs/hive导入到RDBMS中,sqoop不支持直接从hbase导入到RDBMS,但是支持hdfs和hive,而且导出hdfs和导出hive没有什么区别

sqoop export --connect jdbc:mysql://localhost:3306/db --username root --password 密码 --table girl --num-mappers 1 --export-dir /user/hive/warehouse/hive_girl --input-fields-terminated-by "	"

解释
export 导出
--table 原来是从哪张表导入,现在是导出到哪张表,这里是导出到girl这张表
--export-dir hdfs的路径,将那个文件导入到mysql
--input-fields-terminated-by 指定分隔符,原来的数据是什么分隔的,就指定什么

另外如果表不存在,则不会自动创建表

技术图片

这里我依旧导出到girl这张表,但是hive里面的表,我们导入的时候把主键也导入了,所以再导出的时候,会报出主键重复,所以这里把girl表的主键修改一下,再导入看看记录会不会发生变化。

技术图片

执行成功,我们来看看mysql中的数据有没有变化

技术图片

可以看到是导入成功了的。

sqoop的安装和使用(代码片段)

一、概述sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。核心的功能有两个:导入、迁入导出、迁出导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统导出数据:从Hadoop的文件... 查看详情

sqoop集群环境搭建|mysql数据导出hdfs测试(代码片段)

...注获取。1.Sqoop简介ApacheSqoop是在Hadoop生态体系和*RDBMS体系之间传送数据的一种 查看详情

sqoop使用入门(代码片段)

sqoop是apache旗下,用于关系型数据库和hadoop之间传输数据的工具,sqoop可以用在离线分析中,将保存在mysql的业务数据传输到hive数仓,数仓分析完得到结果,再通过sqoop传输到mysql,最后通过web+echart来进行图表展示,更加直观的展... 查看详情

sqoop集群环境搭建|mysql数据导出hdfs测试(代码片段)

...ache软件基金会提供。,主要用于在Hadoop(Hive)与传统的数据库间进行数据的传递,可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop工作机制是将导入或导出命令翻... 查看详情

sqoop的使用之import导入到hdfs

...件的形式,最后才演变成了框架4、用于在hadoop和结构化数据库之间的高效传输批量数据的工具下面我们开始做一些简单是使用,熟悉sqoop的使用方式查看帮助信息:bin/sqoophelp 连接mysqlbin/sqooplist-databases--connectjdbc:mysql://mastercdh... 查看详情

sqoop的安装和验证(代码片段)

  Sqoop是一个用来完成Hadoop和关系型数据库中的数据相互转移的工具,它可以将关系型数据库中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中。  Kafka是一个开源的分布式消息订阅系统  一、Sqoop的... 查看详情

sqoop笔记整理(代码片段)

...数据迁移到hdfs目录或者hive表或者hbase表import原理从传统数据库获取元数据信息(schema、table、field、fieldtype),把导入功能转换为只有Map的Mapreduce作业,在mapreduce中有很多map,每个map读一片数据,进而并行的完成数据的拷贝。export... 查看详情

sqoop学习之路(代码片段)

...作示例五、Sqoop的数据导入1、从RDBMS导入到HDFS中2、把MySQL数据库中的表数据导入到Hive中3、把MySQL数据库中的表数据导入到hbase 正文回到顶部一、概述sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。核心... 查看详情

sqoop安装及使用

简介:  sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具。你可以通过sqoop把数据从数据库(比如mysql,oracle)导入到hdfs中;也可以把数据从hdfs中导出到关系型数据库中。通过将sqoop的操作命令转化为Hadoop的MapReduce... 查看详情

sqoop的简易介绍(代码片段)

sqoop简介ApacheSqoop是一个用于在ApacheHadoop和关系型数据库或主机之间传输数据的工具。Sqoop可以用于从数据库导入数据到Hadoop中,或者将Hadoop中的数据导出到数据库中。它支持各种数据库,如MySQL、Oracle、PostgreSQL、SQLServer... 查看详情

sqoop的介绍以及部署安装(代码片段)

...1)介绍:  Sqoop是Apache旗下的一款“hadoop和关系型数据库服务器之间传送数据”的工具。  导入数据:MySQL、Oracle导入数据到hadoop的hdfs、hive、HBASE等数据存储系统。  导出数据:从hadoop的文件系统中导出数据... 查看详情

sqoop

Sqoop是什么Sqoop是连接传统关系型数据库和Hadoop的桥梁,主要功能是,  把关系型数据库的数据导入到Hadoop系统(如HDFS、HBase和Hive)中  把数据从Hadoop系统里抽取并导出到关系型数据库里可以利用MapReduce加快数据传输速度,使... 查看详情

sqoop安装(代码片段)

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。... 查看详情

大数据之非常详细sqoop安装和基本操作(代码片段)

大数据大数据之非常详细Sqoop安装和基本操作目录大数据Sqoop1、上传解压2、配置环境变量配置sqoop环境变量配置sqoop-env.sh3、加入mysql的jdbc驱动包4、验证验证是否安装成功验证启动5、导入mysql表数据到HDFS6、导出HDFS数据到mysql总结... 查看详情

sqoopetl工具(代码片段)

...定HDFS目录导入 3、导入到HDFS指定目录,并指定字段之间的分隔符4、--where,通过条件过滤MySQL,再导入hdfs 5、通过SQL过滤导入到HDFS中6、MySQL增量数据的导入到HDFS中第一种增量导入使用上面的选项来实现第 查看详情

sqoopetl工具(代码片段)

...定HDFS目录导入 3、导入到HDFS指定目录,并指定字段之间的分隔符4、--where,通过条件过滤MySQL,再导入hdfs 5、通过SQL过滤导入到HDFS中6、MySQL增量数据的导入到HDFS中第一种增量导入使用上面的选项来实现第 查看详情

sqoop的安装与常用抽数操作(代码片段)

...处理一:sqoop简介处理-1.Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。-2.Sqoop中... 查看详情

头歌sqoop数据导出-详解(代码片段)

...(export)的基本参数。Sqoop能够让Hadoop上的HDFS和Hive跟关系型数据库之间进行数据导入与导出,多亏了import和export这两个工具。本实训主要是针对export(导出)来讲。数据在Hadoop平台上进行处理后,我们可能需要将结果同步到关... 查看详情