首页 > 大数据 > Hadoop > hbase 的架构分析
hbase 架构分析:
大:一个表可以有上亿行,上百万列。
面向列:面向列簇的存储和权限控制,列簇独立检索。
稀疏:对于空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
无模式(no Schema):每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
数据多版本:每个单元格中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
数据类型单一:HBase中的数据都是字节数组,没有类型。
HBase架构组件
Region Server:提供数据的读写服务,当客户端访问数据时,直接和Region Server通信。
HBase Master:Region的分配,DDL操作(创建表,删除表)。
Zookeeper:是HDFS的一部分,维护一个活跃的集群状态。
Hadoop DataNode存储着Region Server管理的数据,所有HBase数据存储在HDFS文件系统中,
Region Server在HDFS DataNode中是可配置的,并使数据存储靠近在它所需要的地方,就近服务,当往HBase写数据时Local,但是当一个region被移动之后,HBase的数据就不是Local的,除非做了压缩(compaction)操作。
NameNode维护物理数据块的元数据信息。
HBase Table 通过rowkey range 的范围被水平切分成多个Region,一个Region包含了所有的,在Region开始键和结束之内的行,Regions被分配到集群的节点上,成为Region Servers,提供数据的读写服务,一个region server 可以服务1000个Region。
Region的分裂策略
egion中存储的是一张表的数据,当region中的数据条数过多的时候,会直接影响查询效率。当region过大的时候,region会拆分为两个region,HMaster会将分裂的region分配到不同的region server上,这样可以让请求分散到不同的Region Server上,已达到负载均衡,这也是HBase的一个优点。
当region中最大的store大小超过某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分,一个region等分为2个region。
但是在生产线上这种切分策略却有相当大的弊端(切分策略对于大表和小表没有明显的区分):
阈值(hbase.hregion.max.filesize)设置较大对大表比较友好,但是小表就有可能不会触发分裂,极端情况下可能就1个,形成热点,这对业务来说并不是什么好事。
如果设置较小则对小表友好,但一个大表就会在整个集群产生大量的region,这对于集群的管理、资源使用、failover来说都不是一件好事。
Compaction操作
指选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,在这个过程中不会处理已经Deleted或Expired的Cell。一次 Minor Compaction 的结果是更少并且更大的StoreFile。
Zookeeper 协调器
??Zookeeper一般在分布式系统中的成员之间协调共享的状态信息,Region Server和活跃的HMaster通过会话连接到Zookeeper,Zookeeper维护短暂的阶段,通过心跳机制用于活跃的会话。
有一个特殊的HBase目录表叫做Meta表,它拥有Region在集群中的位置信息,Zookeeper存储着Meta表的位置。
如下就是客户端首次读写HBase 所发生的事情:
客户端从Zookeeper的Meta表中获取Region Server。
客户端将查询 META 服务器,获取它想访问的相对应的Region Server 的行键,客户端将这些信息以及META表的位置信息。
客户端将从相应的Region Server获取行。
META 表 集群中所有Region的列表
META 表像是一个B树
META 表结构为:
Key:region start key,region id
Values:Region Server
HBase Region 刷新(Flush)
??当MemStore 积累到足够的数据,则整个排序后的集合被写到HDFS的新的HFile中,每个列簇使用多个HFiles,列簇包含真实的单元格,或者是键值对的实例,随着KeyValue键值对在MemStores中编辑排序后,作为文件刷新到磁盘上。
??注意列簇是有数量限制的,每一个列族有一个MemStore,当MemStore满了,则进行刷新。它也会保持最后一次写的序列号,这让系统知道直到现在都有什么已经被持久化了。
??最高的序列号作为一个meta field 存储在HFile中,来显示持久化在哪里结束,在哪里继续。当一个region 启动后,读取序列号,最高的则作为新编辑的序列号。
https://blog.csdn.net/hujieliang123/article/details/123193751
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69949806/viewspace-2915157/ ,如需转载,请注明出处,否则将追究法律责任。