so:增,删,改(通过跳表)的复杂度为o(log(n))
查(通过hashtable)的复杂度为O(1)
当然我们不知道有结构化的数据,特别我们存储的数据是需要拿来进行复杂的数据挖掘算法,所以有的时候nosql并不能满足我们的需要
实际的数据
结构化
半结构化(我们的数据)
非结构化
海量(百T级别)
数据偶尔丢掉几条没关系
数据质量差
选择hdfs的原因
hdfs在设计之初考虑到了以下几个方面:
1,hdfs将采用大量稳定性差的廉价pc来做为文件存储设备,所以pc发生死机或硬盘故障的几率极高,应看作是常态,所以hdfs应该提供数据多备份,自动检测节点存活,和故障机器的自动修复
2,hdfs存储的大多是大文件,所以针对大文件的读写会作出优化
3,对于写入数据来说,系统会有很多追加操作,而很少会有随机读写
4,对于读取数据来说,大多数的操作是顺序读,很少有随机读
计算
从理论角度
离线计算 :针对海量的,对实时性要求不是很高的数据
实时流计算 :数据清洗,topn等应用场景
列存储:大表jion,海量数据实时查找
key-value:对半结构化,非结构化数据的实时查找(结构灵活,适合项目初期的试错阶段)
内存和磁盘计算的区别
寻址
内存是通过电子工作的,所以搜索速度和物理结构无关,进行寻址时只需要微秒级别既可以
磁盘在寻址时需要1,移动磁头2,旋转磁盘 因为磁盘旋转的速度有限,所以寻址消耗毫秒别时间
*操作系统会将一个连续的数据存放在一起(win一般是4KB),这样磁盘旋转一周读取的数据就会多些,从而提高效率
传输速度
内存和硬盘的数据都会被读到cpu的缓存中,但是从内存到缓存和从硬盘到缓存的传输速度是差别很大的
内存到缓存的速度大概有7-8GB/秒,而磁盘到缓存的速度大概只有60MB/秒
so:因此内存计算和磁盘计算的速度差可以达到百万倍以上
离线计算
Hadoop现了mapreduce的思想,将数据切片计算来处理大量的离线数据数据。
hadoop处理的数据必须是已经存放在支持的分布式文件系统上或者类似hbase的数据库中,所以hadoop实现的时候是通过移动计算到这些存放数据的机器上来提高效率
ps:针对hadoop我们的使用是开发一个类似pig的mdx框架,与pig的区别是我们的框架会更加的针对业务友好,业务人员只需要了解维度信息和需要的度量即可
实时流计算
storm是一个流计算框架,处理的数据是实时消息队列中的,所以需要我们写好一个topology逻辑放在那,接收进来的数据来处理,所以是通过移动数据平均分配到机器资源来获得高效率
列存储
提出region和Xfile概念(如hbase的HFILE和hive的rcfile以及yuntable的YFile)
根据key将数据分到不同的region,保存log,数据压缩并行列转置后存到Xfile,定期或使用内存到了一定阙值flash到硬盘
列存优点举例-
eg1:通过region和XFile过滤掉大量数据,如果对100g的数据做分析
通过region会过滤掉一大批数据
对于数值类型,每个xfile会有一个预统计(最大最小值)又会过滤掉一部分数据
假设还剩下2.5g的数据
对于频繁使用的数据会在内存中有缓存
假设命中2g
剩下的0.5g会已压缩的方式存放在硬盘(定长字段压缩比更大,当然数字的压缩比最大)
so-100g的查询=》2g的内存查找+0.5g的硬盘查找(内存寻址是硬盘寻址的几百万倍)
eg2:通过动态扩展列来进行大表的jion
google的bigtable进行cookie的join,是将一个几千万的用户行为的表jion到一张100亿行的cookie大表,它只需要将新的表根据cookie重新做一下索引即可,因为数据是列存储所以具体的数据存储不需要实际的硬盘移动,大大减少了jion的时间,尽管这个表有几十万的列但对查找几乎是没有影响的