HBase

分布式、面向列的数据存储系统,通过在HDFS上提供随机读/写来解决Hadoop不能解决的问题。

为了高可用性牺牲了一部分的一致性。

特性

没有真正的索引,行是顺序存储的,每行中的列也是,不存在索引膨胀问题,插入性能和表的大小无关。

自动分区,在表增长的时候,表会自动分裂成区域,并分布到可用的节点上。

线性扩展和对新节点的自动处理,增加一个节点,把它指向现有集群并运行regionserver,区域自动重新进行平衡,负载均匀分布。

廉价,普通商用硬件支持。

容错,大量节点意味每个节点的重要性并不突出,不用担心单个节点失效。

批处理,Mapreduce集成功能使我们可以用全并行的分布式作业根据“数据的位置”来处理它们。

管理超大规模的稀疏表,对于为null的列,并不占用存储空间。

与RDBMS异同

数据类型

RDBMS采用关系模型,具有丰富的数据类型和存储方式;

HBase采用简单的数据模型,将数据存储为未解释的字符数组,所有数据都没有类型,都直接作为字符数组来看待。

数据操作

关系型数据库有丰富的数据操作,并且涉及复杂的多表连接;

HBase操作不存在复杂的表与表之间的连接关系,只有简单的插入、查询、删除、清空等操作,因为HBase在设计上就避免了复杂的表和表之间的关系。

存储机制

RDBMS基于行模式存储;

HBase基于列模式存储,每个列族的数据都保存在一起,不同列族的文件是相互分离的。

数据索引

RDBMS中,有模式、表、视图、索引等多个概念,RDBMS可以根据不同列构建复杂的多个索引,以此来提高数据访问的性能;

HBase实际上只有一个索引——行键(Row Key),表的所有访问都要通过行键,或者通过行键访问,或者通过行键扫描。

数据维护

RDBMS中,更新操作会用当前的最新值去替换记录中的旧值,旧值被覆盖后就不再存在了;

HBase中的每个单元格是有一个以时间戳表示的版本号的,它在执行更新操作时,并不会删除数据的旧版本,而是生成一个具有更新的版本号的新数据,原有旧数据仍然会保存。

可伸缩性

RDBMS大多受限于一台机器的存储容量,只能进行垂直扩展(更换大容量的设备、提升设备性能等等),很难做到横向扩展;

HBase设计的初衷本来是为了实现灵活的横向扩展,能够通过简单的增加节点数量来实现扩展,从而可以存储超大规模数据集,实现超大规模数据的随机访问。

扫描机制

调用HTable的getScanner()方法,返回扫描器(scanner)实例。

可以选择提供起始行和终止行行键。

可以选择使用过滤器(filter)。