目录
大数据框架的生态:
宽表优化(垂直拆分):
高表优化(水平拆分):
MySQL如何增加新的字段?
解决方案的整合:
HBase出现了
大数据框架的生态:
来一张大数据生态体系下的各个框架的作用:
上面的内容,我们可以看出来,Kafka存储的时间虽然可以持续较长的时间,但是kafka还是不能长时间的存储数据,比如存储一年。那么HDFS也是可以存储的啊,为什么还要使用HBase呢?这就类似于为什么要把数据存储在MySQL中,而不是存储在PSV,或者是QSV呢?这是因为我们可以把一些结构化的数据存储在MySQL中,这样我们可以按照字段来查询,还可以使用聚合函数,还可以建立索引从而快速查询等,如果使用PSV做不到。
这里的HBASE和HDFS的关系与MySQL和PSV的关系是有一些类似的,但是和HBASE和MySQL又有一些不样的地方。那么首先呢,我们来了解一下MySQL数据库,如图:
mysql是一个面向行存储的数据库,即存放数据的时候是按照行来存储的,那么在取数据的时候,也一定是按照行的取数据的。select的是过滤,实际上所有的数据都会查,然后select部分的字段值,给你的感觉是查了部分表。
宽表优化(垂直拆分):
数据库表中的数据越多,插询的效率就会越慢,在上面的图中,假设我们登录,值需要select id , name from user where loginame = ? and password = ? 只是需要两个字段,但是MySQL在查询的时候,每次都要查询所有的字段,这样影响速度,这张表显得太宽了,所以我们在设计表的时候,要把宽表拆分一下(所以里面出现了两张表,需要使用外键关联,两张表之间是一对一的关系),来优化数据库,所以得到了下面这张表,
高表优化(水平拆分):
数据非常的深,比如有一亿条数据,这个时候查询的效率也非常的差,我们把这样的表称之为高表,(高表是数据比较多,对比理解宽表的字段比较多),高表的优化是水平拆分,在将高表拆分成为两个字段之后,我们在往表中插入数据的时候,就可以使用使用分区的策略,比如这里奇数放在上面,偶数放在下面,如此一来查询的时候也会更快。
MySQL如何增加新的字段?
在给一个数据库中的表增加字段的时候,会涉及到一些问题,比如对于用户表,我们给用户增微信号字段,但是目前这张表中已经存在很多的数据信息了,而有的老用户是没有微信的,对于上述的高表拆分来讲,不能上面的表没有该字段,下面的表有这个字段吧,此时可以将表设计成如下的形式:
其中,info字段为json格式,javascript object notation {}表示的是对象,[{},{}] 也表示的对象,但是表示的是集合对象具体的格式就是:{"name":"zhangsan","age":20}一般而言,属性名是使用双引号的,字符串的话使用双引号,true等格式都么有问题,多个属性使用逗号隔开。互联网传输的数据都是字符串,从数据库中查询到了数据之后,使用的都是json格式的字符串,而几乎不再使用早期的xml格式。来对比一下差异(flume中使用的avro使用的就是json格式的字符串。):
但是我们把一个json格式的字符串存到表中之后,无法实现按照字段查询,比如无法实现select * from user where name = ? 如果非得获取的话,得将里面的数据取出来做比对,这样很影响效率 。将我们的上面的问题整合一下,设计出来了下面的这张表:
解决方案的整合:
这里有两张表,如果在同一台机器上,当对于user1的访问增大的时候,会影响user2,所以这个时候我们需要把表放在两个机器上,但是用户是不可见的,还会访问之一台机器,所以有负载均衡器,负载均衡器也会有面临巨大的压力,(详见我写的分布式)所以形成下面的结构:
第四步在写数据的时候,如果每一次写数据都要往数据库(文件)里面写,慢,效率低,要么批处理,要么缓存,我们使用缓存,放到MemoryCache之后,什么时候写入数据库有数据库自己决定,但是此时的数据在内存中,断电了怎么办,好的,备份,这里解决的思路和Redis的aof,记录每次的写操作,和2nn的备份,HA的故障转移机制有点相似。 既然放在cache中可能出现数据丢失,干脆先不往里面放,我们先将操作保存在log中,这样数据绝对是安全的。
这样的设计虽然非常好,但是如多数据量大起来,MySQL的InnoDB存储引擎对表空间做了限制:64TB,MyISAM 对表的大小做了限制,256TB ,而现在的数据都是以PB为单位的,mysql无法满足海量的数据的存储。所以HDFS,出现了,但是HDFS无法解决结构化的数据的处理方案,HDFS虽然能存,但是上述的结构,HDFS是处理不了的。所以:
HBase出现了
另外,HBase的原型是Google的BigTable论文。HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群,基于Hadoop。