为什么hbase可以很快
-
从逻辑结构上来说
- 表按照行键进行了排序,所以查询时可以很快定位
- 数据按照行键切分为多个HRegion,分布在多个RegionServer中,查询大量数据时,多个RegionServer可以一起工作,从而提高速度
- 从物理结构上来说:
- HRegion是存活在RegionServer的内存中的,读写会非常的高效
- 还有HFile的支持保证大量的数据可以持久化的保存
- 数据最终落地到HDFS中,分布式的存储,保证数据段可靠性和可扩展性
为什么hbase可以存储很多数据
- 基于hdfs,所以支持可扩展性,可以通过增加大量的廉价的硬件提高存储容量
- 空的数据不占用空间,当存储稀疏数据时,不会浪费空间
- 按例存储,同一列的数据存放在一起,而同一列的数据一般都是同样的类型的内容相似的数据,可以实现非常高效的压缩,节省空间
为什么hbase的数据是可靠的
- 基于hdfs,由hdfs的可靠性保证了hbase的可靠性--即数据可以有多个备份
- 利用zookeeper实现了HA,即使某一台机器挂掉另外的机器也可以很快的替换它
hbase和hive和传统的关系型数据库的比较
- 比起传统的关系型数据库,可以存储半结构化非结构化的数据,可以存储和处理更大级别的数据,提供高效的查询,对于稀疏数据的处理更好,具有更好的横向扩展性,免费开源性价比很高。但是不能支持非常好的事务特性,只支持行级的事务。只能通过行键来查询,表设计时难度更高。而mysql用来存储结构化的数据提供更好的事务控制。
- 比起hive,hive只是在mapreduce上包了一层壳,本质上还是离线数据的处理的工具,实时查询性能有限,本质上是一个基于hadoop的数据仓库工具,不能支持行级别的新增修改和删除。hbase可以提供实时的数据的处理能力,适用于在线数据查询处理,本质上是一种数据库工具。
存储系统三种结构
- 哈希存储引擎(例如HashMap)
hash存储,hashcode()%num (hash取余)
优点:hbase读写效率都高,也支持增删改随机读取数据。
缺点:存入数据的顺序,会丢失掉。
- B树存储引擎(例如MySql)
优点:写效率高,读效率高,顺序信息不会丢失
缺点:当数据量很大,性能大幅下降
- lsm树(例如HBase)
LSM树的设计思想:将对数据的修改增量保持在内存中,最后统一将这些修改操作批量写入磁盘。读取则需要合并磁盘中历史数据和内存中最近修改操作。读取时先读内存,若不存在则访问磁盘。
支持增、删、读、改、顺序扫描操作
牺牲了一部分读的性能换取了高效写入能力
HBase的表设计
- 列族的设计
在设计hbase表时候,列族不宜过多,越少越好,官方推荐hbase表的列族不宜超过3个。
经常要在一起查询的数据最好放在一个列族中,尽量的减少跨列族的数据访问。
如果有多个列族 多个列族中的数据应该设计的比较均匀。
- 行键的设计
hbase表行键设计的好坏,直接影响hbase的查询的性能和查询的便利性
行键必须唯一,必须唯一才能唯一标识数据 |
行键必须有意义,这样才能方便数据的查询 |
行键最好是字符串类型,因为数值类型在不同的系统中处理的方式可能不同 |
行键最好具有固定的长度,不同长度的数据可能会造成自然排序时排序的结果和预期不一致 |
行键不宜过长,行键最多64KB,但最好是在10~100字节之间,最好不要超过16字节,越短越好,最好是8字节的整数倍。 |
行键的设计将会影响数据在hbase表中的排序方式,这会影响region切分后的结果,要注意,在设计行键时应该让经常要查询的数据分散在不同的region中,防止某一个或某几个regionserver成为热点 |
行键的设计将会影响数据在hbase表中的排序方式,所以一种策略是将经常连续查询的条件作为行键最前面的数据,这样一来可以方便批量查询 |