HBase的实现原理

4.4.1 HBase功能组件

HBase的实现包括三个主要的功能组件:
(1)库函数:链接到每个客户端
(2)一个Master主服务器
(3)许多个Region服务器
主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡
Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小

4.4.2 表和Region

每个Region默认大小是100MB到200MB(2006年以前的硬件配置)
每个Region的最佳大小取决于单台服务器的有效处理能力
目前每个Region最佳大小建议1GB-2GB(2013年以后的硬件配置)
同一个Region不会被分拆到多个Region服务器
每个Region服务器存储10-1000个Region

每个Region存储若干个列族数据

Reigon拆分:  Hbase刚建立时只有一个Reigion,随着列族和行数的增多,Reigion不断增大,Reigion就要不断的拆分,Reigion个数不断增长。

       Region拆分操作非常快,接近瞬间。因为拆分只是数据指针的改变,原Reigion对应HDFS文件的拆分异步定时进行。拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件。

4.4.3 Region的定位

元数据表,又名.META.表,存储了Region和Region服务器的映射关系
当HBase表很大时, .META.表也会被分裂成多个Region。即.META表由多个Reigion存储,涉及到查找.META 的Reigion和对应Reigion服务器映射关系问题(由-ROOT表完成)
根数据表,又名-ROOT-表,记录所有元数据的具体位置。记录了.META 的Reigion和对应Reigion服务器映射关系。
-ROOT-表只有唯一一个Region,名字是在程序中被写死的
Zookeeper文件记录了-ROOT-表的位置

 

为了加快访问速度,.META.表的全部Region都会被保存在内存中
假设.META.表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制为128MB,那么,上面的三层结构可以保存的用户数据表的Region数目的计算方法是:
(-ROOT-表能够寻址的.META.表的Region个数)×(每个.META.表的 Region可以寻址的用户数据表的Region个数)
一个-ROOT-表最多只能有一个Region,也就是最多只能有128MB,按照每行(一个映射条目)占用1KB内存计算,128MB空间可以容纳128MB/1KB=128*1024=217行,也就是说,一个-ROOT-表可以寻址217个.META.表的Region。
同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是128MB/1KB=217
最终,三层结构可以保存的Region数目是(128MB/1KB) × (128MB/1KB) = 234个Region

客户端访问数据时的“三级寻址”

为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题(使用缓存的Reigion位置信息查找数据,找到则读取,找不到则重新进行三级寻址,并更新缓存信息)

寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器

 

posted on 2017-06-10 21:22  ostin  阅读(710)  评论(0)    收藏  举报