hbase数据存储与查找原理

人盡茶涼 提交于 2020-03-13 20:15:26

基本概念

RegionServer

HBase的RegionServer就是用来处理客户端读取和写入数据的,和kafka的broker,Elasticsearch的Node的功能相同。

Region

Region和kafka的partition(分区),Elasticsearch的shard(分片)差不多,是个物理概念。

一个表可以有多个Region,一个Region只属于一张表。

组件 逻辑存储 物理存储
Kafka topic partition
Elasticsearch index shard
HBase table region

store

store在HBase中对应的是列簇(Column Family,CF)

列簇在内存中的store是memstore,在磁盘中的是storefile,当内存中的memstore数据达到一定的阈值之后, 就会通过flashcache在磁盘上创建一个新的storefile,并且将memstore中的数据写入这个新创建的storefile。

当storefile文件的数量增长到一定阈值后会进行合并,在合并过程中会进行版本删除工作,从而形成更大的storefile。

当一个region所有storefile的大小和超过一定阈值后,会把当前的region分割为两个,并由master分配到相应的RegionServer服务器,实现负载均衡。

Region是HBase中分布式存储和负载均衡的最小单元,不同的Region可以分布在不同的Regionserver上。

RowKey

HBase定位一行数据的唯一标识,RowKey是按照字典顺序排序的,Rowkey最多只能存储64k的字节数据。

在设计RowKey的时候就应该注意,要让相同数据集的RowKey前缀尽量相同,这样才能分布到一起。

RowKey是写数据的时候才确定的,那个范围的RowKey放那个Region也是创建Region的时候确定

列族(Column Family,CF)

HBase每一行可以有多个列簇,在创建表的时候就必须指定列簇。

create 'table_name', 'cf1','cf2'

每一个列簇可以存放多个列(column),列是不用在创建表的时候指定的。

单元格(Cell)

由rowkey:cf:column确定,单元格是有版本的,其中的内容是未解析的字节数组(Byte[]),cell中的数据是没有类型的,全部是字节码形式存贮。

rowkey+cf+column+version才能唯一定位cell

更加底层的结构是HFile,KeyValue,有兴趣可以研究一下它们的结构

时间戳(Timestamp)

HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间 戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

时间戳的类型是64位整型,HBase会把当前系统时间毫秒做为默认值,也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

读数据

HBase读数据

写数据

HBase写数据

WAL(Write Ahead Log),为了崩溃恢复数据

scan

RegionScanner:扫描Region StoreScanner:扫描Store StoreFileScanner:扫描StoreFile与HFile KeyValueScanner:扫描MemStore

HBase扫描是比较慢的,特别是全表扫描,所以尽量避免,特别是在使用phoenix的时候,不要把HBase当做MySQL来用。

phoenix虽然是SQL,但是底层还是通过HBase的扫描过滤来实现的,非RowKey还是扫描的全部Region。

参考

hbase scan KeyValue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!