Hbase存储结构
HBase是一个分布式的、可伸缩的、大数据存储系统。
HBase的存储结构,包括HRegion、HStore、MemStore和StoreFile等核心组件;
HBase是一个基于列的存储系统,其核心存储单元是HStore。HStore是HBase中最小的存储单元,负责存储数据。每个HStore包含多个MemStore和StoreFile。MemStore是内存中的存储组件,用于缓存数据,而StoreFile则是磁盘上的存储组件,用于持久化数据。
在HBase中,数据按照行进行组织,每一行数据由一个RowKey唯一标识。每个RowKey对应一个HRegion,而每个HRegion又包含多个HStore。每个HStore由一个MemStore和多个StoreFile组成。当数据写入HBase时,首先会被写入MemStore中。当MemStore的大小达到一定阈值时,数据会被刷盘到StoreFile中。
HBase的物理存储结构如下:
- HRegion:HRegion是HBase中
分布式存储和负载均衡的最小单元。每个HRegion负责存储一部分数据,并且每个HRegion都会被分配给一个HRegionServer进行管理。每个HRegion都包含多个HStore,每个HStore对应一个Column Family。 - HStore:HStore是HBase的核心存储单元,由MemStore和StoreFile组成。MemStore用于缓存数据,而StoreFile用于持久化数据。当MemStore中的数据量达到一定阈值时,数据会被刷盘到StoreFile中。每个HStore对应一个Column Family。
- MemStore:MemStore是内存中的存储组件,用于缓存数据。当数据写入HBase时,首先会被写入MemStore中。当MemStore的大小达到一定阈值时,数据会被刷盘到StoreFile中。每个MemStore对应一个Column Family。
- StoreFile:StoreFile是磁盘上的存储组件,用于持久化数据。当MemStore中的数据量达到一定阈值时,数据会被刷盘到StoreFile中。每个StoreFile对应一个Column Family。
在HBase中,数据按照行进行组织,每一行数据由一个RowKey唯一标识。每个RowKey对应一个HRegion,而每个HRegion又包含多个HStore。每个HStore由一个MemStore和多个StoreFile组成。这种组织方式使得HBase能够很好地支持大规模数据的存储和查询。
总结:
HBase的存储结构是其高性能的关键所在。通过将数据分散到多个HRegion和HStore中,实现了数据的分布式存储和负载均衡。同时,通过合理的组织RowKey和Column Family,使得数据能够高效地被检索和查询。深入理解HBase的存储结构,有助于在实际应用中更好地利用其特性,提高大数据处理的效率。
Hbase读写流程?
读:
1:HRegionServer保存着meta表以及表数据,要访问表数据,
首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着。
2:接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer从而读取到Meta,进而获取到Meta表中存放的元数据
3:Client通过元数据中存储的信息,访问对应的HRegionServer,然后扫描所在HRegionServer的Metastore和Storefile在查询数据
4:最后HRegionServer把查询到的数据响应给Client
写
1:Client先访问zookeeper,找到Meta表,并获取Meta表元数据。
2:确定当前将要写入的数据所对应的HRegion和HRegionServer服务器
3:Client向该HRegionServer服务器发起写入数据请求,然后HRegionServer收到请求并响应。
4:Client先把数据写入到Hlog,以防止数据丢失。
5:然后将数据写到Memstore.
6: 如果HLog和Memstore均写入成功,则这条数据写入成功
7:如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中
8:当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合布成一个大的Storefile.
9:当Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。
Hbase的内部机制是什么?
Hbase是一个能适应联机业务的数据库系统
物理存储:hbase的持久化数据是将数据存储在HDFS上。
存储管理:一个表是划分为很多region的,这些region分布式地存放在很多regionserver上的Region内部还可以划分为store,store内部有memstore和storefile.
版本管理:hbase中的数据更新本质上是不断追加新的版本,通过compac操作来做版本间的文件合并Region的split
集群管理:Zookeeper+HMaster+HRegionServer.
HBase使用于怎样的场景?
1:半结构化或非结构化的数据
对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据——适合HBase.
当业务需要存储一些信息时RDBMS需要停机维护,而HBase支持动态增加
2:记录非常稀疏
RDBMS的行有多少列是固定的,为null的列浪费了存储空间。Hbase为null的Column不会被存储,这样既节省了空间又提高了性能
3:多版本数据
根据Rowkey和Columnkey定位到的Value可以有任意数量的版本值,因此对于需要存储变动历史记录的数据,用Hbase就非常方便了
4:超大数据量
当数据量越来越大 RDBMS数据库撑不住了,就出现了读写分离策略,通过一个Master专门负责写操作,多个Slave负责读操作,服务器成本倍增。(分库分表)随着压力增加Maser撑不住了,这时就要分库了,把关联不大的数据分开部署,一些join查询不能用了,需借助中间层。随着数据量的进一步增加,表记录越来越大,查询就变得慢,于是又得搞分表
采用Hbase只需要加机器即可,Hbase
HBase的特点是什么?
1:大:一个表可以有数十亿行,上百万列;
2:无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
3:面向列:面向列(族)的存储和权限控制,列(族)独立检索;
4:稀疏:空null列并不占用存储空间,表可以设计的非常稀疏
5:数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳
6:数据类型单一:Hbase中的数据都是字符串
Hbase的rowKey设计原则
1:`建议是越短越好,不要超过16个字节Rowkey`
Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10-100个字节,不过
原因如下:
1)数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万 =10亿个字节,将近1G数据,这会极大影响HFile的存储效率
2)MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。
3)目前的操作系统是64位,内存8 字节对齐。控制在16个字节,8字节的整数倍利用操作系统最佳特性
2:`Rowkey散列原则`
Rowkey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer降低查询效率。
3:`Rowkey唯一原则`
必须在设计上保证其唯一性。
Hbase中scan和get的功能以及实现的异同