下面看下hbase:meta 表的结构,hbase:meta表中,保存了每个表的region地址,还有一些其他信息,例如region的名字,HRegionInfo,服务器的信息。hbase:meta表中每一行对应一个单一的region。例如我们现在创建一个表名叫"t"。hbase:meta中对应的行会像下面这个样子。

Row

Column Family

Column Qualifier

Value

t,,1351700811858

info

regioninfo

NAME =>
‘t,,1351700811858.
90a3b2353709773ebc2423.
04a79dcbbc90a3b23
53709773ebc2423.’,
STARTKEY => ”,
ENDKEY => ”,
ENCODED => 04a79
dcbbc90a3b23537
09773ebc2423,

   

server

10.7.73.121:64782

   

serverstartcode

1351986939360

具体含义:

rowKey:([table],[region start key],[region id]),
  • rowkey中第一个分隔符前存的是表名;
  • 第二分隔符前存的是region的第一个rowKey,这里两个需要注意,1.如果这个地方为空的话,表明这是table的第一个region。并且如果一个region中startkey和endkey都为空的为,表明这个table只有一个region。2.在mata表中,startkey 靠前的region会排在startkey 靠后的region前面。(Hbase中的keys是按照字段顺序来排序的)
  • region id就是region的id,通常来说就是region创建的时候的timestamp
  • regioninfo 是HRegionInfo的序列化值。
  • server是指服务器的地址和端口
  • serverstartcode 是服务开始的时候的timestamp

根据meta表查找key对应的region

当有一个key需要做put操作的时候,会先扫描meta表,找到对应region,然后进行插入操作。

例如:有一个table具有三个region,每个region的startkey分别是 空,bar,foo,如下图:

 table,,
table,bar,
table,foo,

如果我们需要插入key ‘baz’ ,我们能找meta表中对应的rowkey为(table,bar,1351700819876)。

这个查找完之后会缓存在客户端,下次查询的时候会根据缓存来直接去访问region。

自动split

当不断的往一个table增加数据的时候,最终region会分裂。这样hbase就能保证可以横向的增长了。一个parent region会split两个child region。

在child regions 上线之前我们需要做两件事:

  • 下线parent
    region
  • 把child
    regions的相关信息增加到parent info中

首先是更新meta表中parent
region的info:regioninfo列的值,然后增加两列info:splitA(top child 的HRegionInfo,这里约定top为startkey较小的HReginInfo,bottom则反),和info:splitB(bottom child 的HRegionInfo)。这个操作能保证我们能跟踪到region到底做了写什么,方便后续的操作,以及后续如果操作被迫终端了,也有个凭证,能够根据这些来恢复。最后parent region会被CatalogJanitor清理掉。

更新meta表

在更新完meta表中parent
region的记录的时候,就需要把child region相关插入到meta表中,top child region 的startkey 和paretn的startkey
是一样的,这个时候regionId就发挥他的作用了,如果没有regionId,当meta表中有top region和parent
region的时候,我们就知道需要选择哪个了,因为他们的startkey都一样。而我们使用timestamp作为region的id(如果top region和parent region的timestamp一样的时候,top的region
id 取timestamp+1)。这样我们就能保证child
region总是排在parent region之后。

还有一个比较重要的就是,bottom child必须要先插入到meta表,然后top child才能插入。否则就会出现,在meta表中,bottom region里面的key找到不到对应的region的情况。举个例子还是以上面的例子为基础 meta中rowkey为(table,bar,1351700819876)的region分裂成两个region的meta rowkey分别是(table,bar,1351700819810)和(table,belong,1351700819810),如果这个时候先插入top child:

 table,,
table,bar, <---- offline!
table,bar, <---- top child
table,foo,

例如这个时候我需要找key为bgood,我最终会找到这里的第三行top region里面,但是top region里面并不包含bgood。bgood这个这个key是在bottom region里面的。如果先加入bottom就没有这个问题,如下

table,,
table,bar, <---- offline!
table,belong, <---- bottom child
table,foo,

出错恢复 

一般来说,Hbase可以很好的恢复服务器错误,但是有时候还是会出问题的,如果在slipt的时候,regionserver出错了,或者因为其他原因导致slipt整个周期只执行了一部分。这个时候meta表可能会出错,例如有出错的region在磁盘上面,或者重复的regions等。这个时候我们可以使用hbck工具来进行修复。使用以下命令查看更多hbck的信息:

 /hbase/bin/hbase hbck -h

参考:

https://blog.safaribooksonline.com/2012/11/16/tip-2-hbase-meta-layout/ hbase:meta表

http://hbase.apache.org/book/arch.catalog.html 官方文档meta表

hbase meta表的结构的更多相关文章

  1. hbase meta表修复

    meta表修复一 查看hbasemeta情况hbase hbck1.重新修复hbase meta表(根据hdfs上的regioninfo文件,生成meta表)hbase hbck -fixMeta2. ...

  2. 【转】hbase meta表修复

    [From]https://www.iteye.com/blog/blackproof-2052898 meta表修复一 查看hbasemeta情况 hbase hbck .重新修复hbase met ...

  3. Hbase meta 表异常修复

    Hbase meta表异常修复 标签(空格分隔): Hbase 一,Hbase meta元数据表 1.1 背景 线上Hbase 因为在hbase shell中清空 truncate 'table'一张 ...

  4. -ROOT-表和.META.表结构详解

    在<HBase技术简介>中我们知道,HBase中有两个特殊的表:-ROOT-和.META.. 由于HBase中的表可能非常大,故HBase会将表按行分成多个region,然后分配到多台Re ...

  5. HBase -ROOT-和.META.表结构

    在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操 ...

  6. HBase -ROOT-和.META.表结构(region定位原理)

    在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操 ...

  7. HBase -ROOT-和.META.表结构(region定位原理) 分类: B7_HBASE 2015-03-13 20:52 90人阅读 评论(0) 收藏

    在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操 ...

  8. client 如何找到正确的RegionServer(HBase -ROOT-和.META.表)

    在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操 ...

  9. hbase操作(shell 命令,如建表,清空表,增删改查)以及 hbase表存储结构和原理

    两篇讲的不错文章 http://www.cnblogs.com/nexiyi/p/hbase_shell.html http://blog.csdn.net/u010967382/article/de ...

随机推荐

  1. DataGridView 多线程更新 数据 解决卡顿问题

    使用多线程更新DataGridView,防止页面卡顿和卡死的问题 private delegate void UpdateDataGridView(DataTable dt); private voi ...

  2. linux_jvm_jmap_dump内存分析

    jmap命令   jmap命令 jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等 ...

  3. 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结

    遇到此问题先需确认几个问题: 1)MS DTC是否设置正确? 2)是否启用了防火墙?是否对DTC做了例外? 3)是否做了hosts映射?是否跨网域通信? 开发分布式事务,碰到一个错误“与基础事务管理器 ...

  4. Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

    执行远程shell,启动远程机器的tomat时遇到次错误.后来发现原来是远程机器的.profile被人改掉了! 在.profile里加入 export JAVA_HOME=/home/evans/jd ...

  5. oracle PL/SQL(procedure language/SQL)程序设计之游标cursors

    游标 Cursors--Conception 每一条被Oracle服务器执行的SQL语句都有一个独立的游标与之相关联:隐式游标 Implicit cursors: 用于所有的DML和PL/SQL的SE ...

  6. 剑指Offer17 二叉树的镜像

    /************************************************************************* > File Name: 17_Mirror ...

  7. TCP/IP TIME_WAIT状态

    百度运维部二面面试官问我这个 我直接懵逼了 TIME_WAIT状态是通信双方简历TCP连接后, 主动关闭的一方就会进入TIME_WAIT状态 1.client向server发送FIN(M),clien ...

  8. hdu-5700 区间交(二分+树状数组)

    题目链接: 区间交 Problem Description   小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为l​i​​,r​i​​. 它想选择其中k个区间, 使得这些区间的交的那些 ...

  9. hdu 3652 打表

    思路:直接打表 #include<cstdio> #include<vector> #include<cmath> #include<iostream> ...

  10. SQL Server 2008安装失败问题以及解决办法

    一.检测过程中重启失败解决办法 在键盘上按下组合键[Win]+[R],调出运行窗口. 在窗口中输入“regedit”,点击确定,打开注册表管理界面. 在注册表左侧目录栏中找到如下位置:“HKEY_LO ...