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)。