SQL与NoSQL,数据桥梁Sqoop
作者:网络转载 发布时间:[ 2016/4/12 13:29:34 ] 推荐标签:数据库 MySQL
SQL处理二维表格数据,是一种朴素的工具,NoSQL是Not Only SQL,即不仅仅是SQL。从MySQL导入数据到HDFS文件系统中,简单的一种方式是使用Sqoop,然后将HDFS中的数据和Hive建立映射。通过Sqoop作为数据桥梁,将传统的数据也存入到NoSQL中来了,有了数据,猴戏才刚刚开始。
01 猴年伊始
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之间的数据桥梁。
02 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
'01'
--split-by
id
--num-mappers
1
示例参数说明:
import指令,说明是导入,这儿的“入”是相对于hdfs来说的,即从MySQL导入到hdfs文件系统中。
以双横线开头的是参数,其中connect配置数据库驱动及来源,此处配置了mysql及ip地址和数据库名。
username, password配置用户名密码。table配置来源表名,此处需要注意,如果后面使用了query的方式,即指定了查询语句,此处table需要注释。
columns配置了从表中读取的字段,可以是全部,也可以是部分。同上所求,如果指定了query则不需要配置columns
query是自己指定导出的sql语句,如果需要自定义导出,则使用。注意,这儿有一个where条件,无论是否使用条件,都需要带上where $CONDITIONS,$CONDITIONS是后面配置的条件。
where用于单独设置查询条件
target-dir用于指定导入的目录,从mysql中导入到hdfs中的数据是直接导入到目录,而不是直接指定文件,文件名会自动生成。另外,如果需要在hive中使用分区,此处应该用子分区的名字。比如,增加一个year=2015的分区,那么,建立目录的时候,把数据存入子目录year=2015中去,这样后面在hive中直接增加分区映射即可。delete-target-dir是如果目录存在便删除,否则会报错。
fields-terminated-by用于配置导出的各字段之间,使用的分隔符,为防止数据内容里面包括空格,通常不推荐用空格,’01′也是Hive中推荐的字段分隔符,当然,我们也是为了更好的在Hive中使用数据才这样设置。
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.
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11