Sqoop:SQL与NoSQL间的数据桥梁

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

SQL处理二维表格数据,是一种最朴素的工具,NoSQL是Not Only SQL,即不仅仅是SQL。从MySQL导入数据到HDFS文件系统中,最简单的一种方式就是使用Sqoop,然后将HDFS中的数据和Hive建立映射。通过Sqoop作为数据桥梁,将传统的数据也存入到NoSQL中来了,有了数据,猴戏才刚刚开始。

猴年伊始

SQL处理二维表格数据,是一种最朴素的工具,查询、更新、修改、删除这四种对数据的基本操作,是处理数据的一个巨大进步。近些年,各种新的数据处理技术兴起了,都想革SQL的命,这些技术也被大家统称为NoSQL。

NoSQL最初的意思是No SQL,估计应该是想和SQL划清界线,就像GNU的递归缩写GNU is Not Unix一样。后来发现,虽然大量的NoSQL技术起来了,但SQL还是活得好好的,照样发挥着很多不可替代的作用。渐渐地,大家也发现,原来这些新技术,也只是在不同的应用场景下对SQL的补充,因此也慢慢为NoSQL正名了,原来是Not Only SQL,即不仅仅是SQL,还有很多其它的处理非结构化数据和应用于各种场景的技术。甚至很多技术,虽然是在NoSQL的框架下,但也慢慢的又往SQL方向发展。

NoSQL是一种技术或者框架的统称,包括以Mongodb,Hadoop,Hive,Cassandra,Hbase,Redis等为代表的框架技术,这些都在特定的领域有很多实际的应用。而SQL领域的开源代表自然是MySQL了。

很多企业中,业务数据都是存放在MySQL数据库中的,当数据量太大后,单机版本的MySQL很难满足业务分析的各种需求。此时,可能就需要将数据存入Hadoop集群环境中,那么本文的主角Sqoop便适时的出现了,用来架起SQL与NoSQL之间的数据桥梁。

MySQL导入HDFS

从MySQL导入到HDFS文件系统中,是最简单的一种方式了,相当于直接将表的内容,导出成文件,存放到HDFS中,以便后用。

Sqoop最简单的使用方式,就是一条命令,唯一需要的是配置相应的参数。sqoop可以将所有参数写在一行上,也可以写在配置文件里面。因为导入的选项过多,通常我们都把参数写在配置文件里面,以便更好的调试。在导入到HDFS的过程中,需要配置以下参数:

  • 使用import指令
  • 数据源配置:驱动程序,IP地址,库,表,用户名,密码
  • 导入路径,以及是否删除存在的路径
  • 并行进程数,以及使用哪个字段进行切分
  • 字段选择,以及字段分隔符
  • 查询语句:自定义查询,Limit可以在此处使用
  • 查询条件:自定义条件

配置文件示例:

# 文件名:your_table.options
import

--connect
jdbc:mysql://1.2.3.4/db_name
--username
your_username
--password
your_passwd
--table
your_table

--null-string
NULL

--columns
id, name

# --query
# select id, name, concat(id,name) from your_table where $CONDITIONS limit 100

# --where
# "status != 'D'"

--delete-target-dir
--target-dir
/pingjia/open_model_detail

--fields-terminated-by
'\001'

--split-by
id
--num-mappers
1

示例参数说明:

  1. import指令,说明是导入,这儿的“入”是相对于hdfs来说的,即从MySQL导入到hdfs文件系统中。
  2. 以双横线开头的是参数,其中connect配置数据库驱动及来源,此处配置了mysql及ip地址和数据库名。
  3. username, password配置用户名密码。table配置来源表名,此处需要注意,如果后面使用了query的方式,即指定了查询语句,此处table需要注释。
  4. columns配置了从表中读取的字段,可以是全部,也可以是部分。同上所求,如果指定了query则不需要配置columns
  5. query是自己指定导出的sql语句,如果需要自定义导出,则使用。注意,这儿有一个where条件,无论是否使用条件,都需要带上where CONDITIONSCONDITIONS是后面配置的条件。
  6. where用于单独设置查询条件
  7. target-dir用于指定导入的目录,从mysql中导入到hdfs中的数据是直接导入到目录,而不是直接指定文件,文件名会自动生成。另外,如果需要在hive中使用分区,此处应该用子分区的名字。比如,增加一个year=2015的分区,那么,建立目录的时候,把数据存入子目录 year=2015中去,这样后面在hive中直接增加分区映射即可。delete-target-dir是如果目录存在便删除,否则会报错。
  8. fields-terminated-by用于配置导出的各字段之间,使用的分隔符,为防止数据内容里面包括空格,通常不推荐用空格,'\001'也是Hive中推荐的字段分隔符,当然,我们也是为了更好的在Hive中使用数据才这样设置。
  9. num-mappers是指定并行的mapper(进程数),这也是使用sqoop的一大优势,并行可以加快速度,默认使用4个进程并行。同时,split-by需要设置为一个字段名,通常是id主键,即在这个字段上进行切分成4个部分,每个进程导入一部分。另外,配置几个进程数,最后目录中生成的文件便是几个,因此对于小表,建立设置num-mappers为1,最后只生成一个文件。

上面使用了配置文件的方式,在配置文件中,可以使用#注释,也可以使用空行,这样方便做调试。配置好上面的参数文件,即可调用测试:

sqoop --options-file your_table.options

如果不报错,最后会显示导入的文件大小与文件行数。

这是一个导入速度的记录,供参考:

 

Transferred 3.9978 GB in 811.4697 seconds (5.0448 MB/sec)
Retrieved 18589739 records.

Transferred 3.4982 GB in 350.2751 seconds (10.2266 MB/sec)
Retrieved 16809945 records.

Transferred 846.5802 MB in 164.0938 seconds (5.1591 MB/sec)
Retrieved 5242290 records.

Transferred 172.9216 MB in 72.2055 seconds (2.3949 MB/sec)
Retrieved 1069275 records.

增量导入

HDFS文件系统是不允许对记录进行修改的,只能对文件进行删除,或者追加新文件到目录中。但Mysql数据中的增、删、改是最基本的操作,因此导入的数据,可能一会儿就过期了。

从这儿也可以看出,并非所有数据都适合导入到HDFS,通常是日志数据或者非常大的需要统计分析的数据。通常不太大的表,也建议直接完整导入,因为本身导入速度已经够快了,千万级别的数据,也只是几分钟而已。

如果不考虑数据的修改问题,只考虑数据的增加问题,可以使用append模式导入。如果需要考虑数据修改,则使用lastmodified的模式。

增量的方式,需要指定以下几个参数:

--check-column
filed_name
--incremental
append|lastmodified
--last-value
value
  • check_colume:配置检查增量的字段,通常是id字段,或者时间字段
  • incremental: 增量的方式,追加或者最后修改,追加从上一次id开始,只追加大于这个id的数据,通常用于日志数据,或者数据不常更新的数据。最后修改,需要本身在 Mysql里面,数据每次更新,都更新维护一个时间字段。在此,表示从指定的时间开始,大于这个时间的数据都是更新过的,都要导入
  • last-value: 指定了上一次的id值或者上一次的时间

映射到hive

导入到HDFS中的数据,要进行统计分析,甚至会需要对多个文档进行关联分析,还是有不便之处,此时可以再使用Hive来进行数据关联。

首先,需要在Hive中建立表结构,只选择性的建立导入的数据字段,比如导入了id和name两个字段,则Hive表也只建立这两个字段。

另外,最好通过external关键字指定建立外部表,这样Hive只管理表的元数据,真实的数据还是由HDFS来存储和手工进行更新。即使删除了Hive中的表,数据依然会存在于HDFS中,还可以另做它用。

建表,要指定字段的数据格式,通常只需要用四数据来替换Mysql的数据:

  

string ==> 替换char,varchar

int ==> 替换int

float ==> 替换float

timestamp ==> 替换datetime

另外,还需要指定存储格式,字符分隔符和分区等,常用的一个建表语句如:

CREATE external TABLE your_table (
id int,
name string
)
PARTITIONED BY (pdyear string)
ROW FORMAT DELIMITED fields terminated by '\001'
STORED AS TEXTFILE

上面指定了一个分区pdyear,字段分隔符为'\001',存储成TEXTFILE格式,数据文件的目录为/path/your_table(从MySQL导入到HDFS的目录)。

如果导入的数据,配置了分区,即如下目录结构:

/path/your_table/pdyear=2015

/path/your_table/pdyear=2016

则建立表后,表里面没有对应上数据,需要添加分区到hive表中,在hive中执行以下语句:

alter table your_table add partition (pdyear='2015') location '/path/your_table/pdyear=2015';
alter table your_table add partition (pdyear='2016') location '/path/your_table/pdyear=2016';

完成上面的操作后,即可以在Hive中进行查询和测试,查看是否有数据。Hive的hql语法,源于mysql的语法,只是对部分细节支持不一样,因此可能需要调试一下。

HDFS导出到MySQL

在Hive中进行了一系列的复杂统计分析后,最后的结论可能还是需要存储到Mysql中,那么可以在Hive语句中,将分析结果导出到HDFS中存储起来,最后再使用Sqoop将HDFS的文件导入到MySQL表中,方便业务使用。

导出的配置示例:

export

--connect
jdbc:mysql://1.2.3.4/db_name
--username
your_username
--password
your_passwd
--table
your_table

--input-null-string
'\\N'

--update-mode
allowinsert
--update-key
id
--export-dir
/path/your_table/
--columns
id,name
--input-fields-terminated-by
'\001'

参数说明:

  • export:指令说明是导出
  • update-mode:allowinsert,配置了,使用更新模式,即如果Mysql中已经有数据了,则进行更新,如果没有,则插入。判断的字段使用update-key参数配置,需要这个字段是唯一索引的字段。
  • input-null-string:Hive中,导出的NULL为字符\N,要还原到Mysql中,依然为MyQL的Null的话,需要使用这个配置,指定NULL的字符串为'\N'
  • 另外,导出的时候,如果Mysql表中有自动增长的主键字段,可以留空,生成数据的时候会自动填充。

猴戏开始

将MySQL中的数据导入到HDFS中,又将HDFS中的数据建立了到Hive表的映射。至此,通过Sqoop工具作为SQL与NoSQL的数据桥梁,将传统的数据也存入到NoSQL中来了,有了数据,便是开始。


本文作者:云戒

来源:51CTO

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
325
分享
相关文章
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
66 9
阿里云DTS踩坑经验分享系列|DTS打通SQL Server数据通道能力介绍
SQL Server 以其卓越的易用性和丰富的软件生态系统,在数据库行业中占据了显著的市场份额。作为一款商业数据库,外部厂商在通过解析原生日志实现增量数据捕获上面临很大的挑战,DTS 在 SQL Sever 数据通道上深研多年,提供了多种模式以实现 SQL Server 增量数据捕获。用户可以通过 DTS 数据传输服务,一键打破自建 SQL Server、RDS SQL Server、Azure、AWS等他云 SQL Server 数据孤岛,实现 SQL Server 数据源的流动。
122 0
阿里云DTS踩坑经验分享系列|DTS打通SQL Server数据通道能力介绍
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
134 4
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
SQL 数据库大揭秘:连接数字世界的魔法桥梁
在数字化时代,数据如繁星般璀璨,而 SQL 数据库则像强大的引力场,有序汇聚、整理和分析这些数据。SQL 数据库是一个巨大的数字宝库,装满各行各业的“宝藏”。本文将带你探索 SQL 数据库在电商、金融、医疗和教育等领域的应用。例如,在电商中,它能精准推荐商品;在金融中,它是安全卫士,防范欺诈;在医疗中,它是健康管家,管理病历;在教育中,则是智慧导师,个性化教学。此外,还将介绍如何利用板栗看板等工具实现数据可视化,提升决策效率。
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
1075 4
SQL和NoSQL数据库的全面比较
不可否认,已有越来越多开发人员愿意使用NoSQL数据库,并且在不断地壮大着其相应的社区。但是,相对于成熟的SQL社区,该领域的专家和顾问可能需要更多的时间,去解决那些未曾被记录的NoSQL问题。
211 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等