sqoop--数据库和hdfs之间的搬运工

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 "\t"

解释:
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 "\t" --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 "\t" --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 "\t" --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 "\t" --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 "\t"

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

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

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

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

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

原文地址:https://www.cnblogs.com/traditional/p/12111933.html

时间: 2024-10-31 22:24:01

sqoop--数据库和hdfs之间的搬运工的相关文章

sqoop实现关系型数据库与hadoop之间的数据传递-import篇

由于业务数据量日益增长,计算量非常庞大,传统的数仓已经无法满足计算需求了,所以现在基本上都是将数据放到hadoop平台去实现逻辑计算,那么就涉及到如何将oracle数仓的数据迁移到hadoop平台的问题. 这里就不得不提到一个很实用的工具--sqoop,它是一款开源的工具,主要用于实现关系型数据库与hadoop中hdfs之间的数据传递,其中用的最多的就是import,export了. sqoop的安装配置也是非常简单的,这里就不说明了,本文主要针对如何使用sqoop实现oracle到hive(h

sqoop操作之HDFS导出到ORACLE

注意:在导出前需要先创建待导出的表结构.如果导出的表在数据库中不存在则会报错:如果重复导出多次,表中的数据会重复: create table EMP_DEMO as select * from EMP where 1=2; create table SALGRADE_DEMO as select * from SALGRADE where 1=2; 导出表的所有字段 sqoop export --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL

老李分享:大数据,数据库,数据仓库之间是什么关系

老李分享:大数据,数据库,数据仓库之间是什么关系 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200. 首先简单的看一下云计算与大数据的概念. 1)云计算:云计算本质上是一种计算资源集中分布和充分共享的效用计算模式,其中集中是为了计算资源的集约化管理,分布是便于扩展计算能力.集中分布式是针对云服务提供商的,充分共享是针对用户,在云计算中,虽然对

ES 译文之如何使用 Logstash 实现关系型数据库与 ElasticSearch 之间的数据同

译者前言近期的主要工作是在为公司的 APP 增加搜索功能.因为也遇到了需要把关系型数据库中的数据同步 ElasticSearch 中的问题,故抽了点时间翻译了这篇官方的博文.最近,在数据同步方面也有些思考.本篇文章的重点不在 Logstash 的 JDBC 插件的使用方法,而是数据同步会遇到的一些细节问题如何处理.我觉得,这些设计思想是通用的,无论你使用的何种方式进行数据同步.翻译正文 为了利用 ElasticSearch 强大的搜索能力,大部分的业务都会在关系型数据库的基础上部署 Elasti

使用sqoop 在关系型数据库和Hadoop之间实现数据的抽取

(一)从关系型数据库导入至HDFS 1.将下面的参数保持为 import.script import --connectjdbc:mysql://192.168.1.14:3306/test--username root--password 1234 -m1--null-string''--table user--columns "id,username,age"--target-dir/user/root/sqoop_test  -- 此目录不能存在 2. 执行sqoop --opt

SQOOP可能会导致HDFS分片数量过多的总结

使用多少个mapreduce来进行移植数据,例如: ./sqoop import --create-hive-table  --hive-import --hive-overwrite   --connect jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:orcl --username name --password pwd --table tablename --hive-database hivedatabasename -m 5 上面使用了5个任务,然后数据

[hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 数据在mysq和hdfs之间的相互转换

P573 从mysql导入数据到hdfs 第一步:在mysql中创建待导入的数据 1.创建数据库并允许所有用户访问该数据库 mysql -h 192.168.200.250 -u root -p CREATE DATABASE sqoop; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; 或 GRANT SELECT, INSERT, DELETE,UPDATE ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; 查看权限:sel

Sqoop导入到hdfs

1.注意win下直接复制进linux 改一下--等 sqoop-list-databases --connect jdbc:mysql://122.206.79.212:3306/ --username root -P 先看一下有什么数据库,发现有些数据库,能查询到的数据库才能导入,很奇怪. 2.导入到hdfs sqoop import --connect jdbc:mysql://122.206.79.212:3306/dating --username root --password 123

关于使用sqoop export 导出hdfs数据到mysql中文乱码问题

前几天使用sqoop将hdfs的数据导入mysql中,发现中文导进去后会乱码,我的执行命令是: sqoop export  --connect "jdbc:mysql://10.19.157.*****?useUnicode=true&characterEncoding=utf-8" --table msg_rule_copy --username root --password root*** --export-dir $path --hadoop-home $home --