HBase概述:是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。可以存储半结构化、非结构化的数据。利用Zookeeper作为协调工具,以HDFS作为文件存储系统,以mapReduce来处理HDFS中的海量数据。
HBase的逻辑结构:行键(RoeKey):相当于HBase表中的主键,所有数据都要按照行键的字典顺序排序后存储。对HBase表中的数据的查询,有三种方式:根据指定行键查询 根据指定行键的范围查询 全表扫描查询
列族(ColumnFamily):列族是HBase表从纵向来切分的逻辑结构,一个列族包含若干列,是HBase元数据的一部分
列:一个列族中包含多个列,在创建HBase表时不需要创建列,因为它可以在表创建之后动态的添加,不属于元数据的一部分。
单元格和时间戳:在HBase表中,行和列交汇得到HBase中的一个存储单元,在这个存储单元中可以存储数据的多个版本,这些版本通过时间戳来区分。通过行键、列族、列、时间戳确定的一个最小的存储数据的单元,叫做单元格。单元格中的数据都是以二进制形式存储的。
HBase的核心组件:HRegion:HBase起初只有一个HRegion保存数据,随着数据写入,HRegion越来越大,达到一定的阈值后自动分裂为两个HRegion,随着数据写入,HRegion会越越多,Hbase表中的数据被划分为若干个Hregion进行管理。
HRegion会分布式的存放在集群的HregionServer服务器中,从而实现分布式存储和负载均衡。
HRegion内部会有若干个store,Store的个数取决于列族的个数,一个Store内部又有一个memStore和若干个storeFile.storeFile本质上就是HDFS中的HFile文件。
HBase的写数据流程:当客户端联系HBase要写入一条数据时,根据表名和行键确定要操作的是哪个Hregion,找到存储着该Hregion的HregionServer服务器进行操作。根据要操作的列族找到对应的Store,向Store中的memStore中写入文件,并且在HLog中记录操作日志。之后返回写入成功,写入过程是基于内存的,性能好。
- 如果在写入时memStore满了怎么办?
如果memStore被写满时。Store会自动又生成一个memStore继续工作。这个时候HBase会启动一个独立的线程,将满了的memStroe中的数据写入到HDFS中的HFile中,将数据持久化。
在不停的产生HFile的过程中,同一个Store产生多个HFile中可能存在对同一个数据的不同的版本,其中有失效的数据,但是HDFS只能一次写入多次读取不能删除和修改,垃圾无法清除,降低查询性能。这个时候,HBase触发HFile的合并操作,将同一个Store产生的HFile合并成一个HFile,期间进行垃圾清理。当不停的合并达到一定大小的时候Hfile会拆分成若干个小Hfile,防止Hfile过大。 - 断电memStore丢失数据怎么办?
HRegionServer中存在名为HLog的日志文件,在向memStore中写入数据的同时,数据需要写入HLog中记录操作日志,而在memStore满了溢写到HFile中完成之后,HBase会将把最后一条持久化到HDFS中的日志的编号记录到Zookeeper中的redo point。一旦数据丢失,只需要找到Zookeeper中找到最后持久化日志的编号,从HLog中将这个编号之后的数据恢复到内存中就可以找回所有丢失的数据。
HBase的读流程:当客户端联系Hbase表示要读取某一张表时,HBase根据表和行键确定出HRegion,然后找到存储该HRegion的HRegionServer。根据要查找的列族,确定出要查找的Store,首先查看memStore中是否有要查找的数据,如果有,直接返回查询结果,如果在memStore中没有要查找的数据,那么查询该Store对应的所有的StoreFile.
在这个过程中,解析StoreFile,先读取StoreFile中的Trailer块,找到DataBlockIndex,根据索引判断要找的数据在当前的StoreFile中是否存在,不存在直接返回空,存在的话根据索引快速找到对应的DataBlocks中的DataBlock返回。
多个StoreFile可能返回多个DataBlock,之后在内存中将这些DataBlock信息合并完成查询。
HBase的HRegion的寻址:在HBase表中有一张特殊的Hbase:meta表,表中存放着HBase的元数据信息(HBase中有哪些表,表中有哪些HRegion,Hregion分布在哪个HRegionServer中)。 在meta表中,只有一个HRegion,这个Hregion存放在某一个HRegionServer中,并且会将这个持有meta表的HregionServer的地址存放在Zookeeper中的meta-region-server节点下。
每次读写时,先访问Zookeeper中的meta-region-server的值,然后根据值找到Meta表存储的HRegionServer,得到Meta表唯一个HRegion。根据该Hregion中的表和行键找到真正操作的HRegionServer.
第二次之后,会将访问的地址存储在本地缓存中,下次操作不需要在来一次这样的寻址,提升性能。
三种常见的存储系统: - hash存储:hash存储是引擎,是哈希表的持久化实现,支持增删改以及随机读取操作。但是不支持顺序扫描
如果不需要有序的数据遍历,哈希表是最好的选择。 - B树存储:是B树的持久化实现,不仅支持增删改读操作,还支持顺序扫描。
- LSM树存储:LSM树的存储引擎和B树存储事务引擎一样,同样支持增删改读操作和顺序扫描。LSM树读性能低,写性能高。