在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer。什么叫相应的RegionServer?就是管理你要操作的那个Region的RegionServer。Client本身并不知道哪个RegionServer管理哪个Region,那么它是如何找到相应的RegionServer的?本文就是在研究源码的基础上揭秘这个过程。
在前面的文章“HBase存储架构”中我们已经讨论了HBase基本的存储架构。在此基础上我们引入两个特殊的概念:-ROOT-和.META.。这是什么?它们是HBase的两张内置表,从存储结构和操作方法的角度来说,它们和其他HBase的表没有任何区别,你可以认为这就是两张普通的表,对于普通表的操作对它们都适用。它们与众不同的地方是HBase用它们来存贮一个重要的系统信息——Region的分布情况以及每个Region的详细信息。
好了,既然我们前面说到-ROOT-和.META.可以被看作是两张普通的表,那么它们和其他表一样就应该有自己的表结构。没错,它们有自己的表结构,并且这两张表的表结构是相同的,在分析源码之后我将这个表结构大致的画了出来:
-ROOT-和.META.表结构
我们来仔细分析一下这个结构,每条Row记录了一个Region的信息。
首先是RowKey,RowKey由三部分组成:TableName, StartKey 和 TimeStamp。RowKey存储的内容我们又称之为Region的Name。哦,还记得吗?我们在前面的文章中提到的,用来存放Region的文件夹的名字是RegionName的Hash值,因为RegionName可能包含某些非法字符。现在你应该知道为什么RegionName会包含非法字符了吧,因为StartKey是被允许包含任何值的。将组成RowKey的三个部分用逗号连接就构成了整个RowKey,这里TimeStamp使用十进制的数字字符串来表示的。这里有一个RowKey的例子:
Table1,RK10000,12345678
然后是表中最主要的Family:info,info里面包含三个Column:regioninfo, server, serverstartcode。其中regioninfo就是Region的详细信息,包括StartKey, EndKey 以及每个Family的信息等等。server存储的就是管理这个Region的RegionServer的地址。
所以当Region被拆分、合并或者重新分配的时候,都需要来修改这张表的内容。
到目前为止我们已经学习了必须的背景知识,下面我们要正式开始介绍Client端寻找RegionServer的整个过程。我打算用一个假想的例子来学习这个过程,因此我先构建了假想的-ROOT-表和.META.表。
我们先来看.META.表,假设HBase中只有两张用户表:Table1和Table2,Table1非常大,被划分成了很多Region,因此在.META.表中有很多条Row用来记录这些Region。而Table2很小,只是被划分成了两个Region,因此在.META.中只有两条Row用来记录。这个表的内容看上去是这个样子的:
.META.行记录结构
现在假设我们要从Table2里面插寻一条RowKey是RK10000的数据。那么我们应该遵循以下步骤:
1. 从.META.表里面查询哪个Region包含这条数据。
2. 获取管理这个Region的RegionServer地址。
3. 连接这个RegionServer, 查到这条数据。
好,我们先来第一步。问题是.META.也是一张普通的表,我们需要先知道哪个RegionServer管理了.META.表,怎么办?有一个方法,我们把管理.META.表的RegionServer的地址放到ZooKeeper上面不久行了,这样大家都知道了谁在管理.META.。
貌似问题解决了,但对于这个例子我们遇到了一个新问题。因为Table1实在太大了,它的Region实在太多了,.META.为了存储这些Region信息,花费了大量的空间,自己也需要划分成多个Region。这就意味着可能有多个RegionServer在管理.META.。怎么办?在ZooKeeper里面存储所有管理.META.的RegionServer地址让Client自己去遍历?HBase并不是这么做的。
HBase的做法是用另外一个表来记录.META.的Region信息,就和.META.记录用户表的Region信息一模一样。这个表就是-ROOT-表。这也解释了为什么-ROOT-和.META.拥有相同的表结构,因为他们的原理是一模一样的。
假设.META.表被分成了两个Region,那么-ROOT-的内容看上去大概是这个样子的:
-ROOT-行记录结构
这么一来Client端就需要先去访问-ROOT-表。所以需要知道管理-ROOT-表的RegionServer的地址。这个地址被存在ZooKeeper中。默认的路径是:
/hbase/root-region-server
等等,如果-ROOT-表太大了,要被分成多个Region怎么办?嘿嘿,HBase认为-ROOT-表不会大到那个程度,因此-ROOT-只会有一个Region,这个Region的信息也是被存在HBase内部的。
现在让我们从头来过,我们要查询Table2中RowKey是RK10000的数据。整个路由过程的主要代码在org.apache.hadoop.hbase.client.HConnectionManager.TableServers中:
private HRegionLocation locateRegion(final byte[] tableName, final byte[] row, boolean useCache) throws IOException { if (tableName == null || tableName.length == 0) { throw new IllegalArgumentException("table name cannot be null or zero length"); } if (Bytes.equals(tableName, ROOT_TABLE_NAME)) { synchronized (rootRegionLock) { // This block guards against two threads trying to find the root // region at the same time. One will go do the find while the // second waits. The second thread will not do find. if (!useCache || rootRegionLocation == null) { this.rootRegionLocation = locateRootRegion(); } return this.rootRegionLocation; } } else if (Bytes.equals(tableName, META_TABLE_NAME)) { return locateRegionInMeta(ROOT_TABLE_NAME, tableName, row, useCache, metaRegionLock); } else { // Region not in the cache – have to go to the meta RS return locateRegionInMeta(META_TABLE_NAME, tableName, row, useCache, userRegionLock); } }
这是一个递归调用的过程:
获取Table2,RowKey为RK10000的RegionServer => 获取.META.,RowKey为Table2,RK10000, 99999999999999的RegionServer => 获取-ROOT-,RowKey为.META.,Table2,RK10000,99999999999999,99999999999999的RegionServer => 获取-ROOT-的RegionServer => 从ZooKeeper得到-ROOT-的RegionServer => 从-ROOT-表中查到RowKey最接近(小于) .META.,Table2,RK10000,99999999999999,99999999999999的一条Row,并得到.META.的RegionServer => 从.META.表中查到RowKey最接近(小于)Table2,RK10000, 99999999999999的一条Row,并得到Table2的RegionServer => 从Table2中查到RK10000的Row
到此为止Client完成了路由RegionServer的整个过程,在整个过程中使用了添加“99999999999999”后缀并查找最接近(小于)RowKey的方法。对于这个方法大家可以仔细揣摩一下,并不是很难理解。
最后要提醒大家注意两件事情:
1. 在整个路由过程中并没有涉及到MasterServer,也就是说HBase日常的数据操作并不需要MasterServer,不会造成MasterServer的负担。
2. Client端并不会每次数据操作都做这整个路由过程,很多数据都会被Cache起来。至于如何Cache,则不在本文的讨论范围之内。
原文: http://www.spnguru.com/2010/07/hbase%E4%B8%AD%E7%9A%84client%E5%A6%82%E4%BD%95%E8%B7%AF%E7%94%B1%E5%88%B0%E6%AD%A3%E7%A1%AE%E7%9A%84regionserver/
相关推荐
HBase 中有两张特殊的 Table,-ROOT-和.META.。 * .META.:记录了用户表的 Region 信息,.META.可以有多个 region。 * -ROOT-:记录了.META.表的 Region 信息,-ROOT-只有一个 region。 * Zookeeper 中记录了-ROOT-...
Hbase中有两张特殊的系统表,即-ROOT-和.META.。-ROOT-记录了.META.表的Region信息,只有一个region;而.META.记录了用户表的Region信息,可以有多个region。Client访问用户数据之前需要首先访问Zookeeper,然后访问...
Zookeeper在HBase中扮演着关键角色,它不仅存储了根表-ROOT-和元数据表.META.的位置信息,还负责协调HMaster的选举,确保没有单点故障。HBase中的多个HMaster通过Zookeeper的Master Election机制来确定主HMaster,主...
HBase中有两张特殊的Table,-ROOT-和.META.,其中.META.记录了用户表的Region信息,.META.可以有多个region,而-ROOT-记录了.META.表的Region信息,-ROOT-只有一个region。 HBase是一个功能强大且高效的分布式存储...
它不仅存储了-ROOT-表和HMaster的地址,还通过Ephemeral节点监控HRegionServer的状态,防止HMaster成为单点故障。HMaster的选举以及Region迁移等关键操作都依赖Zookeeper。 3. **HMaster**:HMaster主要负责表管理...
- **灵活性**: 表结构无需预定义,动态增加列族。 - **集成性**: 紧密集成到Hadoop生态系统中,支持MapReduce等计算框架。 #### 二、HBase原理详解 **1. 存储模型**: - **RowKey**: 表中的每一行都有一个唯一的...
表**(HBASE-4377):允许在离线模式下构建.META.表,避免了在线操作可能导致的数据不一致或服务中断问题。 - **即时模式更新**(HBASE-4213):增强了模式更新的即时性,使得数据结构的调整更加高效、迅速。 - **...
客户端访问数据时,首先访问Zookeeper获取-ROOT-表的位置,然后访问-ROOT-表得到.META.表的位置信息,再访问.META.表获取用户表Region的信息,最后才能定位到具体的数据。为了提高效率,客户端通常会对这些信息进行...
HBase包含两个特殊的表:`.META.` 和 `-ROOT-`。 - **.META.**:记录用户表的Region信息,.META.本身也可以被分割成多个Region。 - **-ROOT-**:记录了.META.表的Region信息,-ROOT-通常只包含一个Region。需要注意...
HBase中有两个特殊表格:-ROOT-和.META.。它们主要用于存储元数据信息。 1. **-ROOT-**:只包含一个region,用于记录.META.表的区域位置信息。 2. **.META.**:记录用户自定义表的所有Region的位置信息。 客户端...
- **区域(Region)的定位**:在HBase中,数据的定位依赖于一个层次化的结构,首先通过Zookeeper找到(ROOT)-ROOT-表的位置,然后找到.META.表,.META.表保存了所有用户表的region信息。区域定位过程最多需要三次...
通过这种方式,客户端在查询数据时需要先访问Zookeeper获取-ROOT-表的位置,再通过-ROOT-表找到.META.表,最后才能定位到具体的用户数据位置。这一过程虽然涉及到多次网络通信,但客户端通常会进行缓存以减少延迟。 ...
值得注意的是,系统中存在两个特殊表:“-ROOT-”和“.META.”,它们用于存储所有表的区域位置信息,确保数据定位的高效性。 HBase与Hadoop MapReduce的集成是其处理大数据的关键。通过MapReduce,用户可以编写复杂...
- **查找Region**:为了定位某行数据所在的Region,HBase使用.ROOT-和.META-表来维护Region的元数据信息。 #### HBase架构 - **Region Server**:Region Server负责处理读写请求,并且可以横向扩展。 - **Master**...
HMaster也维护`.ROOT.`和`.META.`表,这两张特殊表存储了所有表的元数据信息。 2. **RegionServer**:实际存储和处理数据的节点,每个RegionServer可以托管多个Region,Region是HBase数据存储的基本单位。...
1. **无固定字段定义的表结构**:与传统的关系型数据库不同,HBase的表没有预定义的字段,允许用户自由添加列。每张表都由行键(Row Key)来标识,行键是唯一的,且默认按升序排序。 2. **行键(Row Key)**:行键...
- 在0.96之前的版本中,寻址过程包括查找-ROOT-表和-.META.表的位置。 - 新版本中,寻址过程简化为直接从Zookeeper获取-.META.表的位置。 #### 七、HBase的读取与写入 - **写入操作**:数据写入时先存入MemStore...
HBase还依赖两张特殊的表——`-ROOT-`和`.META.`来存储Region信息,实现快速的数据定位和查询。 总的来说,HBase是应对大数据挑战的关键组件,通过其列式存储、分布式处理和灵活的数据模型,为企业提供了强大的...