Region Region和kafka的partition(分区),elasticsearch的shard(分片)差不多,是个物理概念。 一个表可以有多个Region,一个Region只属于一张表。 组件 逻辑存储 物理存储
Region和kafka的partition(分区),elasticsearch的shard(分片)差不多,是个物理概念。
一个表可以有多个Region,一个Region只属于一张表。
组件 | 逻辑存储 | 物理存储 |
---|---|---|
Kafka | topic | partition |
Elasticsearch | index | shard |
HBase | table | region |
store在HBase中对应的是列簇(Column Family,CF)
列簇在内存中的store是memstore,在磁盘中的是storefile,当内存中的memstore数据达到一定的阈值之后, 就会通过flashcache在磁盘上创建一个新的storefile,并且将memstore中的数据写入这个新创建的storefile。
当storefile文件的数量增长到一定阈值后会进行合并,在合并过程中会进行版本删除工作,从而形成更大的storefile。
当一个region所有storefile的大小和超过一定阈值后,会把当前的region分割为两个,并由master分配到相应的RegionServer服务器,实现负载均衡。
Region是HBase中分布式存储和负载均衡的最小单元,不同的Region可以分布在不同的Regionserver上。
HBase定位一行数据的唯一标识,RowKey是按照字典顺序排序的,Rowkey最多只能存储64k的字节数据。
在设计RowKey的时候就应该注意,要让相同数据集的RowKey前缀尽量相同,这样才能分布到一起。
RowKey是写数据的时候才确定的,那个范围的RowKey放那个Region也是创建Region的时候确定
HBase每一行可以有多个列簇,在创建表的时候就必须指定列簇。
create "table_name", "cf1","cf2"
每一个列簇可以存放多个列(column),列是不用在创建表的时候指定的。
由rowkey:cf:column确定,单元格是有版本的,其中的内容是未解析的字节数组(Byte[]),cell中的数据是没有类型的,全部是字节码形式存贮。
rowkey+cf+column+version才能唯一定位cell
更加底层的结构是HFile,KeyValue,有兴趣可以研究一下它们的结构
HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间 戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
时间戳的类型是64位整型,HBase会把当前系统时间毫秒做为默认值,也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
WAL(Write Ahead Log),为了崩溃恢复数据
RegionScanner:扫描Region StoreScanner:扫描Store StoreFileScanner:扫描StoreFile与HFile KeyValueScanner:扫描MemStore
HBase扫描是比较慢的,特别是全表扫描,所以尽量避免,特别是在使用phoenix的时候,不要把HBase当做Mysql来用。
phoenix虽然是sql,但是底层还是通过HBase的扫描过滤来实现的,非RowKey还是扫描的全部Region。
hbase scan KeyValue
--结束END--
本文标题: hbase数据存储与查找原理
本文链接: https://lsjlt.com/news/4964.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0