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.