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会把当前系统时间毫秒做为默认值,也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
读数据
写数据
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