微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HBase ROOT和META表结构是怎样的

这篇文章主要介绍“HBase ROOT和Meta表结构是怎样的”,在日常操作中,相信很多人在HBase ROOT和Meta表结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HBase ROOT和Meta表结构是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在此基础上我们引入两个特殊的概念:-ROOT-和.Meta.。这是什么?它们是HBase的两张内置表,从存储结构和操作方法的角度来说,它们和其他HBase的表没有任何区别,你可以认为这就是两张普通的表,对于普通表的操作对它们都适用。它们与众不同的地方是HBase用它们来存贮一个重要的系统信息——Region的分布情况以及每个Region的详细信息。

好了,既然我们前面说到-ROOT-.Meta.可以被看作是两张普通的表,那么它们和其他表一样就应该有自己的表结构。没错,它们有自己的表结构,并且这两张表的表结构是相同的,在分析源码之后我将这个表结构大致的画了出来:

-ROOT-和.Meta.表结构

HBase ROOT和META表结构是怎样的

我们来仔细分析一下这个结构,每条Row记录了一个Region的信息。

首先是RowKey,RowKey由三部分组成:TableName, StartKey 和 TimeStamp。RowKey存储的内容我们又称之为Region的Name。哦,还记得吗?我们在前面的文章中提到的,用来存放Region的文件夹的名字是RegionName的Hash值,因为RegionName可能包含某些非法字符。现在你应该知道为什么RegionName会包含非法字符了吧,因为StartKey是被允许包含任何值的。将组成RowKey的三个部分用逗号连接就构成了整个RowKey,这里TimeStamp使用十进制的数字字符串来表示的。这里有一个RowKey的例子: 

Java代码         

HBase ROOT和META表结构是怎样的

 

  1. 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.行记录结构

HBase ROOT和META表结构是怎样的

这么一来Client端就需要先去访问-ROOT-表。所以需要知道管理-ROOT-表的RegionServer的地址。这个地址被存在ZooKeeper中。认的路径是: 

Java代码         

HBase ROOT和META表结构是怎样的

 

  1. /hbase/root-region-server  

 等等,如果-ROOT-表太大了,要被分成多个Region怎么办?嘿嘿,HBase认为-ROOT-表不会大到那个程度,因此-ROOT-只会有一个Region,这个Region的信息也是被存在HBase内部的。 

现在让我们从头来过,我们要查询Table2中RowKey是RK10000的数据。整个路由过程的主要代码在org.apache.hadoop.hbase.client.HConnectionManager.TableServers中: 

Java代码         

HBase ROOT和META表结构是怎样的

 

  1. private HRegionLocation locateRegion(final byte[] tableName,  

  2.         final byte[] row, boolean useCache) throws IOException {  

  3.     if (tableName == null || tableName.length == 0) {  

  4.         throw new IllegalArgumentException("table name cannot be null or zero length");  

  5.     }  

  6.     if (Bytes.equals(tableName, ROOT_TABLE_NAME)) {  

  7.         synchronized (rootRegionLock) {  

  8.             // This block guards against two threads trying to find the root  

  9.             // region at the same time. One will go do the find while the  

  10.             // second waits. The second thread will not do find.  

  11.             if (!useCache || rootRegionLocation == null) {  

  12.                 this.rootRegionLocation = locateRootRegion();  

  13.             }  

  14.             return this.rootRegionLocation;  

  15.         }  

  16.     } else if (Bytes.equals(tableName, Meta_TABLE_NAME)) {  

  17.         return locateRegionInMeta(ROOT_TABLE_NAME, tableName, row, useCache, MetaRegionLock);  

  18.     } else {  

  19.         // Region not in the cache – have to go to the Meta RS  

  20.         return locateRegionInMeta(Meta_TABLE_NAME, tableName, row, useCache, userRegionLock);  

  21.     }  

  22. }  

 这是一个递归调用的过程: 

Java代码             

  1. 获取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,则不在本文的讨论范围之内。

到此,关于“HBase ROOT和Meta表结构是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程之家网站,小编会继续努力为大家带来更多实用的文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐