HBase

概述
HBase是一个分布式的、面向列的开源数据库,该技术来源于Google的一篇论文《Bigtable》一个结构化数据的分布式存储系统"。HBase适合存储 半结构化、非结构化的数据,适合存储稀疏的数据,空的数据不占用空间。
HBase的逻辑结构
①行键–RowKey:相当于HBase表中的主键,所有的表都要有行键。HBase中所有的数据都要按照行键的字典顺序排序后存储。查询HBase表中的数据,主要有三种方式:根据指定行键查询;根据指定的行键范围查询;全表扫描查询。
②列族–ColumnFamily:是HBase表中垂直方向保存数据的结构,列族是HBase表的元数据的一部分,需要在定义HBase表时就指定好表具有哪些个列族,列族中可以包含一个或多个列(Column,不需要在创建表时预先定义)
③单元格和时间戳(Cell和TimeStamp)
HBase表中,水平方向的列和垂直方向的列交汇得到了HBase中的一个存储单元—单元格。
单元格中的数据都以二进制形式存储,没有数据类型的区别。
HRegion的分裂
HBase表中最初只有一个HRegion保存数据,随着数据写入,HRigion越来越大,达到一定的阈值后会自动分裂为两个HRegion。随着这个过程的不断进行,HBase表中的数据会被分为若干个HRegion进行管理。
HRegion是HBase表中的数据进行分布式存储和负载均衡的基本单元。
HRegion的内部结构
Region内部划分为若干个Store。一个列族对应一个Store。Store内部又有一个memStore和若干个storeFile(本质上是HDFS中的称为HFile的文件)。
HBase的存储原理
①客户端联系HBase写入数据,根据表名和行键名确定要操作的是那个HRegion,然后找到存储着该HRegion的HRegionServer。HRegionServer对该HRegion进行操作。
②根据要操作的列族确定要操作的store,向store中的memStore中写入当前数据,并在HLog中记录操作日志
当memStore内存满了
HBase会重新生成一个新的memStore继续工作,不再对旧的memStore写入数据。此时HBase会启动一个独立的线程,将旧的memStore中的数据写入到HDFS中的一个新的HFile中,最终将数据持久化保存在了HDFS中。
HFile清理垃圾数据
当不停产生HFile过程中,同一个Store先后产生的多个HFile中,可能存在对同一个数据的多个不同的版本,其中旧的版本的数据很可能已经是失效的垃圾数据了。因为HDFS中只能一次写入多次读取,不支持行级别的增删改,这些垃圾数据无法及时清理。最终造成浪费存储空间,降低查询性能。
解决方法:当HFile达到一定的量或者达到一定的时间间隔,HBase会触发HFile的合并操作,将同一个Store先后产生的多个HFile合并成一个HFile,在合并的过程中,会将垃圾数据清理掉。当不停的合并产生达到了一定大小的HFile后,HFile还会被拆分为若干个小的HFile,防止HFile过大。
内存断电丢数据
在向memStore写入数据时,数据也要同时写入HLog中记录操作日志。HLog文件本质上是存在HDFS中的一个文件,通过对HDFS中的这个文件不停的追加数据记录操作日志。
当memStore满了时,HBase会将最后一条持久化到HFile中的日志的编号记录到Zookeeper中的redo point。这样一旦断电丢失内存数据,只需要到Zookeeper中找到最后一条持久化的日志的编号,再从HLog中将这个编号之后的数据恢复到内存中即可以找回所有的数据。
在HBase中,一个HRegionServer,一个HLog。
HBase的读数据流程
① 根据行键确定出HRegion,找到存储该HRegion的HRegionServer。
② 根据要查找的列族,确定要查询的Store。首先在memStore中寻找要查询的数据,如果能查到,直接返回查询到的数据。
③ 如果memStore找不到要查询的数据,则要查询该store对应的所有的storeFile
解析storeFile:先读取storeFile中的Trailer块,找到DataBlockIndex,根据索引判断要找的数据在当前的storeFile中是否存在。如果不存在,直接返回空;如果存在则根据索引快速找到对应的DataBlocks中的DataBlock返回。
这样多个storeFile可能返回了多个DataBlock,其中包含着多个版本的查询的数据结果,之后在内存中将这些DataBlock信息合并,得到最新的数据返回,完成查询。
HBase的寻址过程
①首先由客户端开始,访问Zookeeper得到其中的meta-region-server的值,根据该值找到meta表唯一的HRegion存储的HRegionServer,得到meta表唯一的HRegion
②从中读取真正要查询的表和行键对应的HRegion的地址,再根据该地址,找到真正的操作的HRegionServer和HRegion,完成HRegion的定位,继续读写操作。
!!!客户端会缓存之前已经查找过的HRegion的地址信息,之后的HRegion定位中,如果能在本地缓存中的找到地址,就直接使用该地址提升性能。
HBase的表设计
1. 行键设计的基本原则:
①行键必须唯一:必须唯一才能唯一标识数据
② 行键必须有意义:这样才能方便数据的查询
③ 行键最好是字符串类型:因为数值类型在不同的系统中处理的方式可能不同
④ 行键最好具有固定的长度:不同长度的数据可能会造成自然排序时排序的结果和预期不一致
⑤ 行键不宜过长:行键最多可以达到64KB,但是最好是在10~100字节之间,最好不要超过16字节,越短越好,最好是8字节的整数倍。
2. 行键设计的最佳实践:
① 散列原则:行键的设计将会影响数据在HBase表中的排序方式,这会影响region切分后的结果,要注意,在设计行键时应该让经常被查询的热点数据分散在不同的region中,防止某一个或某几个RegionServer成为热点。
② 有序原则:行键的设计将会影响数据在HBase表中的排序方式,所以一种策略是通过设计行键将将经常连续查询的数据排列在一起,这样一来可以方便批量查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值