Hbase的体系结构
1. Client : hbase客户端,
包含访问hbase的接口。比如,linux shell,java api。
除此之外,它会维护缓存来加速访问hbase的速度。比如region的位置信息。
2. Zookeeper :
监控Hmaster的状态,保证有且仅有一个活跃的Hmaster。达到高可用。
它可以存储所有region的寻址入口。如:root表在哪一台服务器上。
实时监控HregionServer的状态,感知HRegionServer的上下线信息,并实时通知给Hmaster。
存储hbase的部分元数据。
Zookeeper虽然是自成一家的第三方组件,不属于Hbase体系,但是Zookeeper在Hbase中的重要性甚至超过了Master。因为你读取数据所需要的元数据表hbase:meata的位置存储在Zookeeper上。
3. HMaster :
- 为HRegionServer分配Region(新建表等)。
- 负责HRegionServer的负载均衡。
- 负责Region的重新分配(HRegionServer宕机之后的Region分配,HRegion裂变:当Region过大之后的拆分)。
- Hdfs上的垃圾回收。
- 处理schema的更新请求
4. HRegionServer :
- 维护HMaster分配给的Region(管理本机的Region)。
- 处理client对这些region的读写请求,并和HDFS进行交互。
- 负责切分在运行过程中组件变大的Region。
5. HLog :
-
对HBase的操作进行记录,使用WAL写数据,优先写入log(put操作:先写日志再写memstore,这样可以防止数据丢失,即使丢失也可以回滚)
作用:实现了高可靠性。
6. HRegion :
1.它是表或者表的一部分。
2 HBase中分布式存储和负载均衡的最小单元
3 当region达到阀值时,进行切分,形成两个等分新region,父region失效
由hmaster重新分配给regionserver,尽可能达到负载均衡
理解
一个表按rowkey来切割 是有序的 每一个表都是有范围的 区域
字节数组
一个表被分成多个region ,region和regionserver 是多对多关系
一个Region代表的是一张 Hbase表中特定Rowkey范围内的数据,
而Hbase是面向列存储的数据库,所以在一个Region中,有多个文件来存储这些列。
Hbase中数据 列是由列簇来组织的,所以每一个列簇都会有对应的一个数据结构,
Hbase将列簇的存储数据结构抽象为Store,一个Store代表一个列簇。
7. Store :
- 相当于一个列簇
理解:
Store中
每一次的插入操作都会先进入MemStore(内存缓冲区),
当 MemStore达到上限的时候,Hbase会将内存中的数据输出为有序的StoreFile文件数据(根据Rowkey、版本、列名排序,这里已经和列 簇无关了因为Store里都属于同一个列簇)。
这样会在Store中形成很多个小的StoreFile,当这些小的File数量达到一个阀值的时 候,Hbase会用一个线程来把这些小File合并成一个大的File。
这样,Hbase就把效率低下的文件中的插入、移动操作转变成了单纯的文件输出、 合并操作。
由上可知,在Hbase底层的Store数据结构中,
每个StoreFile内的数据是有序的,
但是StoreFile之间不一定是有序的,
Store只 需要管理StoreFile的索引就可以了。
这里也可以看出为什么指定版本和Rowkey可以加强查询的效率,因为指定版本和Rowkey的查询可以利用 StoreFile的索引跳过一些肯定不包含目标数据的数据。
8. Memstore :
- 内存缓冲区,用于将数据批量刷新到hdfs中,默认大小为128M
一个特殊的内存,未持久化或者未达到阀值时,用于存储客户端的写数据 并对已经存在的数据,进行排序。
达到阀值后,将数据封装成storefile对象,然后调用hdfs的客户端接口,将数据持久化,生成Hfile
清空内存,
为后续的写操作腾出空间
所以:和file会有多个
9. StoreFile :
- 和HFile概念意义,不过是一个逻辑概念。HBase中的数据是以HFile存储在Hdfs上
其regionserver 会调用hdfs的接口 去存储
10.HFile
当MemStore满了之后,Hbase就会在HDFS上生成一个新的Hfile,然后把Memstore中的内容写入到这个HFile中。因此HFile会随着数据的增减而有多个。
为了提高性能,Hbase没间隔一段时间或者文件大小达到阀值后,都会进行一次合并,合并的对象就是HFile文件。当合并成一个HFile时,会忽略掉DELETE类型的记录,从而达到了删除的目的,并对剩下的数据做排序和版本合并。形成一个大的HFile,当Hfile的大小达到需要切分的阀值时,会等分为两个HFile。。
11.HDFS:
Hadoop的一部分,Hbase并不直接跟服务器的硬盘交互,而是跟HDFS交互,所以HDFS是真正承载数据的载体。
hbase基于hdfs
相同列族的数据存放在一个文件中。
[表数据的存储目录结构构成]
hdfs://s201:8020/hbase/data/${名字空间}/${表名}/${区域名称}/${列族名称}/${文件名}