插播小广告,本人的《大话Java性能优化》一书已经在亚马逊、京东、当当、天猫出售,提前谢谢大家支持。
Hbase深入学习(八) ―― region server and hmasterserver
Hbase在逻辑上的存储最小单位是region,物理上来说是hfile。每个region由多个hfile组成。那么,是否有一个推荐值,确定每台regionserver上运行多少个region,每个region的size多大是最合适的呢?
以目前主流服务器的能力计算,给出了以下推荐值:每台regionserver管理10-1000个regions,每个region大小在1-2gb.对应于hbase-site.xml中的一个配置项为hbase.hregion.max.filesize.如果按推荐值计算每台regionserver管理的数据量,最少可以到10*1gb=10gb,最大可以到1000*2gb=2tb。考虑到3份备份,总数据量在6tb左右。通常来讲这里磁盘的配置就有两种方案:一是3快2tb的硬盘;二是12块500gb的硬盘。两种硬盘容量一样,后者硬盘快速增加。如果硬盘总线带宽够用,后一种能提供更大的吞吐率,更细粒度的磁盘冗余备份,更快的单盘故障恢复时间。那么,hbase是如何划分region的呢?
在hbase表中的所有行都按照行键的字典序排列,在行的方向上分割为多个region。
Region是按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阙值的时候,region就会等分成两个region.当table中的不断增多,就会有越来越多的region。
Region是hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的region可以分布在不同的hregion server上,但一个region是不会拆分到多个server上的。
Region虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,hregion由一个或者多个store组成,每个store保存一个列族的数据。每个store又由一个memstore和0到多个storefile组成。
当客户端进行更新操作时,先连接到相关的hregionserver,然后向region提交变更。提交的数据首先要写入wal和memstore中,当memstore中的数据累计到某个阙值时,hregionserver就会启动一个单独的线程讲memstore中的内容刷新到磁盘,形成一个storefile文件。当storefile文件的数量增长到一定的阙值后,就会将多个storefile文件合并到一个storefile,合并过程中将进行版本合并和数据删除。因此可以看出hbase其实只能增加数据,所有的更新和删除操作都是在后续的合并过程中进行的。Storefile在合并过程中组件形成更大的storefile,当storefile大小达到一定阙值后,会把当前的region分割成两个region,并由hmaster分配到相应的region服务器上,实现负载均衡。
Hmaster主服务器
Hbase每时每刻只有一个hmaster主服务器程序在运行,hmaster将region分配给region服务器,协调region服务器的负载并维护集群的状态。Hmaster不会对外提供数据服务,而是由region服务器负责所有regions的读写请求及操作。
由于hmaster只维护表和region的元数据,而不参与数据的输入/输出过程,hmaster失效仅仅会导致所有的元数据无法被修改,但表的数据读/写还是可以正常进行的。
为region server分配region.
负责region server的负载均衡。
发现失效的region server并重新分配其上的region.
Gfs上的垃圾文件回收。
处理schema更新请求。
region server维护master分配给它的region,处理对这些region的i/o请求。
Region server负责切分在运行过程中变得过大的region.
可以看到,client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和regionserver,数据读写访问region server),master仅仅维护着table和region的元数据信息,负载很低。
元数据表
用户表的regions元数据被存储在meta表中,随着region的增多,meta表中的数据也会增大,并分割成多个regions。为了定位meta表中各个regions的位置,把meta表中所有regions的元数据保存在root表中,最后由zookeeper记录root的位置,然后访问root表获得meta的位置,最后根据meta表中的信息确定用户数据存放的位置。
Root表永远不会被分割,它只有一个region,这样就保证了最多需要3次跳转就可以定位任意一个region.为了加快访问速度,meta表的regions全部保存在内存中。客户端会将查询过的信息缓存起来,且缓存不会自动失效。如果客户端根据缓存信息还访问不到数据,则询问持有meta表的region服务器,试图获取数据的位置。如果还是失效,则访问root表相关的meta表在哪里。
什么是zookeeper?
Zookeeper 作为 Hadoop 项目中的一个子项目,是Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、Server 之间状态同步等。