想必在数据量情况少的情况下我们首先想到的时擅长于存储的常见数据库如MySQL或者oracle,甚至我们可以将企业的web Server,db Server都装载到一个服务中,但是随着时间或者公司的成长数据库会越来越满。
这时候我们想到了读写分离,使用Master/salve架构,使用Master负责写操作,使用几个Salve负责写操作。
但是随着压力增大,Master节点压力也变大,一般我们采用的是进行垂直分库,就是将没有逻辑关系的数据表,分布在不同的数据库中。当数据一直增大导致一张表的数据会特别大,这样也会使得一个数据表的查询变得特别慢,我们只能采取的水平分区的办法,将一个表的数据量限制在10W,来减轻库的压力。
毕竟不是最终的解决办法,不能解决数据一直激增的存储问题。Hadoop是通过集群的方式,即通过增加机器的方式解决了数据的存储问题。
目前oracle虽然可以搭建集群 但是当数据量达到一定限度之后查询处理速度会变得很慢 且对机器性能要求很高。
SQL数据库和Hadoop 区别
- 用向外扩展代替向上扩展 Hadoop集群就是增加更多的机器。一个Hadoop集群的标配是十至数百台计算机。而不是专注于提高单台服务器的性能
- 用键/值对代替关系表 SQL 针对结构化查询语句 是结构化数据,hadoop针对的是非结构化数据,文本形式 关系数据库是 有一定格式,而存放文本、图片和xml文件 则应该用键值对的方式
- 用函数式编程(MapReduce)代替声明式查询(SQL) hadoop读取出的数据,可以建立复杂的模型或者改变图片格式
- 用离线批量处理代替在线处理 Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式。
同时在设计Hadoop时考虑的是对大量数据的存储和操作,虽然在小量的数据上Hadoop可能不如RDMS,但是大量数据存储情况下,如HDFS可以存储超大的文件,更新或修改大部分数据时MapReduce效率大于常见数据的B树查询。
为什么不通过使用数据库加上更多磁盘来做大规模批量分析?为什么我们还需要MapReduce?
1、磁盘驱动器寻址时间的速度远远慢于传输速率的提高速度,寻址就是将磁头移动到特定位置进行读写操作的工序,它的特点是磁盘操作有延迟,而传输速率对应磁盘的带宽。如果数据的访问受限于磁盘的 寻址,势必会导致它花更长的时间来读或写大部分数据。
2、在更新一小部分数据的情况下,传统的B树效果很好,但在更新大部分数据时,B树的效率就没有MapReduce的高,因为它需要使用排序/合并来重建数据库。
在很多情况下,MapReduce能够被视为一种RDBMS的补充,MapReduce很适合处理那些需要分析整个数据集的问题,以批处理的方式,尤其是Ad Hoc(自主或即时)分析。RDBMS适用于点查询和更新 (其中,数据集已经被索引以提供低延迟的检索和短时间的少量数据更新)。MapReduce适合数据被一次写入和多次读取的应用,而RDBMS更适合持续更新的数据集。
为什么数据库使用B树索引而非散列索引?
一般关系型数据库使用B 树来做索引,NoSQL数据库用哈希来做索引。MySQL就普遍使用B Tree实现其索引结构。 因为索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。
因此为了提高效率,要尽量减少磁盘I/O。
为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理: 当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。
根据B Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现中B-Tree在每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。 综上所述, 用B-Tree作为索引结构效率是非常高的。 而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。 B Tree更适合外存索引,原因和内节点出度d有关。从上面分析可以看到,d越大索引的性能越好,而出度的上限取决于节点内key和data的大小,由于B Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能