Hadoop之 Hbase实现原理(一)

1. 表(Table)和Region
在一个Hbase中,存储了许多表。对于每个表而言,表中的行是按照行键的字典序排列维护的。表中的行数可能数量庞大,无法存储在一台机器上,所以需要分布存储在多台机器上。
Q:如何划分这个很大的表?使它能分布的存储到多台机器上?
A:可根据行键的值,对表中的数据进行分区,每一个行区间构成一个分区,称为“Region”。 一个Region包含了某个值域区间内的所有数据。
Region是负载均衡和数据分发的基本单位,Region们会被分发到不同的RegionServer上。

初始时,每个表只有一个Region,随着数据的不断插入,Region也会不断变大,当一个Region中的行数量到达一定阈值时,就会分裂为两个Region,父Region下线,子Region被Master分配到合适的RegionServer上,使得原来一个Region的压力被分配到两个Region上。
Q:当客户端想要获取数据时,但又由于Region被分发到不同的RegionServer上,客户端要如何知道该数据存储于哪个RegionServer呢?
A:HBase拥有相应的Region定位机制~
每个Region都有一个RegionID来标识它的唯一性。一个Region标识符表示为:“表名+开始主键+Region”。
为了定位每个Region所在位置,标识符结合RegionServer标识构建成一张映射表,该表每个条目包含两项内容,一项是Region标识、另一项是RegionServer标识。此表被称为“.MATE.表”。
当Hbase中的Region数量非常庞大时,.MATE.表就会条目繁多一个服务器保存不了,需要分区保存到不同的服务器上,因此,.MATE.表也会被分为多个Region,为了定位这些Region,需要再构建一个映射表,这个表被称为“根数据表”,又名“-ROOT-表”。

  • “-ROOT-表”不可再分割;
  • 永远只存储在一个Region中,Master永远知道这个Region的位置;
  • .MATE.表的全部Region都保存在内存中,以加快访问速度。
层次 名称 作用
第一层 Zookeeper文件 记录了-ROOT-位置信息
第二层 -ROOT-表 记录了.MATE.表位置信息
第三层 .MATE.表 记录了HBase用户数据表的Region位置信息
客户端访问之前,首先访问Zookeeper,获取-ROOT-表位置信息,再访问-ROOT-表,获取.MATE.表位置信息,接着访问.MATE.表,获取Region位置信息,最后到达相应RegionServer读取数据。
2. Hbase的功能组件
Hbase主要的功能组件有3个:库函数、一个Master、n个RegionServer
  • 库函数:实现客户端到Hbase的连接;
  • Master主服务器:管理和维护HBase表的分区信息,维护Region服务器列表;
  • RegionServer:存储、维护分配得到的Region,处理来自客户端的读写操作。
上面的概述有点让人懵,这里稍作说明。Master类似于HDFS中的NameNode,只是起到管理、引导(路由)的作用,对于数据层面的具体的读、写等操作并不涉及。它记录了一个Table被分裂成哪些Region,每个Region又被存放在哪台RegionServer上这样的信息。所以,如果Master发生故障,整个系统就gameover了。
但如果是RegionServer发生故障呢?Master是实时监测RegionServer的,一旦RegionServer发生故障,Master便将该Server上的Region重新分配到其它可用的RegionServer上,同时确保集群内不同RegionServer之间能够负载均衡。
上面讲到客户端不是直接从Master获取数据,而是先获取Region的存储位置信息后,再直接从RegionServer获取数据。
Q:所以客户端是从Master获取Region位置信息,在据此信息从相应RegionServer上直接获取数据??
A:不,事实上,Hbase客户端并不依赖于Master,而是借助于Zookeeper来获取Region位置信息的,以此来减少Master的负载。
【Hadoop之 Hbase实现原理(一)】综上:Master都发挥了什么作用?
  • 负责Hbase中Table和Region的管理,包括Table的增删改查;
  • 维护RegionServer的负载均衡、Region的分布调度;
  • RegionServer失效后的Region迁移;
  • Region的分裂以及Region分裂后的Region分配。

    推荐阅读