1.Region 分配
 
HMaster负责为Region 分配Region Server,一个Region 只能分配给一个Region server。 HMaster中 记录:
 
  • 哪些Region 已经分配到哪些Region Server中
  • 哪些Region server 可用
  • 哪些Region 尚未分配
 
当HMaster发现有尚未分配的Region,并有Region server可用时,会向改server发送请求,server收到请求后对该region提供服务。
 
2. Region 定位
 
Region的name:
<表名,startRowkey,创建时间>, 如:quote_data,,
 
(因此一个region只能记录一个表?一个表可以有多个 region,但是一个region只能记录一个表的数据???)
(1)0.94- 版本
 
     之前讲到,Zookeeper中记录了所有Region的寻址入口,此处说的是入口(此处入口其实指的是.META.表的存放位置信息),不是真正的Region地址。真正的地址存放在.META.表中
 
     HBASE中有两张特殊的表:.META. 和-ROOT-表,这两张表跟HBase其它表在访问上没有任何区别,只是他们记录了HBase中的系统信息。Region分配到那个Region Server是随机的,因此需要一种机制对Region进行定位。 
 
  • .META.表
 
   用户表的所有Region信息记录在.META.表中,表中的一条记录对应一条region的详细信息,包括server的具体地址等:
 
   --Rowkey:Region的name,其中包含了表名等信息
   --Column Family:info, 包含了如下三列:regioninfo,server和serverstartcode。 其中 regioninfo包含了 NAME, STARTKEY, ENDKEY 等信息。
    
  • -ROOT-表
   当用户表非常大的时候,.META.的region也会不断增加,HBase引入了第二张特殊表-ROOT-,用来记录.META.的Region信息。-ROOT-表的结构与.META.的结构一样。
   
    由于只有一个region,regioninfo字段中的开始字段startkey和结束字段endkey都为空。
 
    根据region的命名规则,知道-ROOT-中记录的都是.META.表的信息,所以从上图可以看到-ROOT-的rowkey类似于.META.,,1,只是它的rowkey里没有时间戳,而直接是一个数字。
 
     那么如果-ROOT-表太大了,要被分成多个Region怎么办?HBase认为-ROOT-表不会大到那个程度,因此-ROOT-只会有一个Region,这个Region的信息也是被存在HBase内部的,具体是存放在Zookeeper中 /hbase/rs下的,因为-Root-表的Region只有一个,所以不存在寻址问题,直接记录在Zookeeper中,寻址过程如图所示:
 
  
可以将-ROOT-表看成是简表,.META.表看成是详表:
 
                                  
 
这就是HBase的三级定位寻址法(最多三次,如果已经在Memstore中就不需要再访问这么多次了)
(2)0.96+版本
 
     hbase0.96版本后删除了root 表,因为觉的目的是根据root表获取meta地址,过程是通过zookeeper获取root表地址,再根据root表记录meta表地址进行访问,还不如和zookeeper通讯一次。新增了namespace,详细见patch设计。
 
     同时将.META.表重命名为:hbase:meta (放在名为hbase的表空间下), 在hbase:meta表中的column family info中增加了一列:seqnumDuringOpen. 而且rowkey(region 的name )重新定义如下:
 
<表名,startRowkey,创建时间时间戳+"."+encode值+"."> (旧版的不包含encoded值)
 
如下为hbase:meta表的一条记录:rowkey=iqm:instrument_common_index,66666660,1474393055082.adcf19159f1116c6e1e194b3d10a7c79., 该记录的encoded值为: adcf19159f1116c6e1e194b3d10a7c79
                              
 
 
  • startKey,region的开始key,第一个region的startKey是空字符串;
  • endKey,region的结束key,最后一个region的endKey是空字符串;
  • encode值,该值会作为hdfs文件系统的一个目录,假设encode值为: da1aec29c13725e29786e920bcc2d7b0 ,存放如下如图:
 
 
  • 用来存放region的文件夹的名字是region name的哈希值,因为region的name中有startkey,所以可能含有非法字符,所以取它的hash值来作为目录名称存放region文件。
      
    改造后的寻址示意图如下:
 
 
 
  
 HRegion命名的相关知识背景:

HRegion是按照表名+开始/结束主键,即表名+主键范围来区分的。由于主键范围是连续的,所以一般用开始主键就可以表示相应的HRegion了。

不过,因为我们有合并和分隔操作,此时,如果正好在执行这些操作的过程中出现死机,那么就可能存在多份表名和开始主键相同的数据,这样的话,只有光靠开始主键就不够了,

这就需要通过HBase的元数据信息来区分哪一份才是正确的数据文件。

为此,为了区分这样的情况,每个HRegion都有一个'regionId'来标识它的唯一性。所以一个HRegion的表达符,最终是:表名+开始主键+唯一Id,
即tablename+startkey+regionId。 用户表的region名中regionId使用时间戳标识的,.META.表的region名的regionId是直接用数字标记的。
 

HRegion 分配与寻址的更多相关文章

  1. HBase 原理

    遗留问题: 数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的 ...

  2. HBase 底层原理详解(深度好文,建议收藏)

    HBase简介 HBase 是一个分布式的.面向列的开源数据库.建立在 HDFS 之上.Hbase的名字的来源是 Hadoop database,即 Hadoop 数据库.HBase 的计算和存储能力 ...

  3. 【转】Linux设备驱动之I/O端口与I/O内存

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281367.html 一.统一编址与独立编址 该部分来自于:http://blog.ch ...

  4. DMA内存申请--dma_alloc_coherent 及 寄存器与内存【转】

    转自:https://blog.csdn.net/ic_soc_arm_robin/article/details/8203933 在项目驱动过程中会经常用到dma传输数据,而dma需要的内存有自己的 ...

  5. I/O 端口和 I/O 内存

    每个外设都是通过读写它的寄存器来控制. 大部分时间一个设备有几个寄存器, 并且在连 续地址存取它们, 或者在内存地址空间或者在 I/O 地址空间. 在硬件级别上, 内存区和 I/O 区域没有概念上的区 ...

  6. 我终于看懂了HBase,太不容易了...

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在我还不了解分布式和大数据的时候已经听说过HBa ...

  7. CSAPP =2= 信息的表示和处理

    思维导图 预计阅读时间:30min 阅读书籍 <深入理解计算机系统 第五版> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 ...

  8. 每个线程分配一个stack,每个进程分配一个heap;heap没有结构,因此寻址慢(转)

    学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分. ...

  9. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

随机推荐

  1. KiCad EDA 5.1.4 发布了

    KiCad EDA 5.1.4 发布了 KiCad EDA 自豪地宣布 KiCad 5 系列最新稳定版发布.5.1.4 稳定版修复了来自 5.1.2 和 5.1.3 版本的关键错误修复和其他一些小改进 ...

  2. 单颗GPU计算能力太多、太贵?阿里云发布云上首个轻量级GPU实例

    摘要: 阿里云发布了国内首个公共云上的轻量级GPU异构计算产品——VGN5i实例,该实例打破了传统直通模式的局限,可以提供比单颗物理GPU更细粒度的服务,从而让客户以更低成本.更高弹性开展业务. 在硅 ...

  3. 【NS2】ns2 otcl与c++关联(转载)

    最近几天,对ns2进行研究,ns2为什么要使用两种语言,因为C++执行速度快,因此对于一些不需要经常改变的东西:例如包的发送.而对于需要经常进行修改的就不能够使用C++,而使用OTcl脚本语言.所有O ...

  4. Java练习 SDUT-2737_小鑫の日常系列故事(六)——奇遇记

    小鑫の日常系列故事(六)--奇遇记 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 今天,小鑫在山上玩的时候,意外被推下 ...

  5. 创建ros消息时出现:Unable to load msg [planning/Num]: Cannot locate message [Num]: unknown pack.....

    创建ros消息可参考创建ROS消息和ROS服务. 按照这个教程进行创建的过程中出现了如下错误: Unable to load msg [msgs/locate]: Cannot locate mess ...

  6. @loj - 2092@ 「ZJOI2016」大森林

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Y 家里有一个大森林,里面有 n 棵树,编号从 1 到 n. ...

  7. android学习——Android Layout标签之-viewStub,requestFocus,merge,include

    定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...

  8. CDQ分治 三维偏序

    这应该是一道CDQ分治的入门题目 我们知道,二维度的偏序问题直接通过,树状数组就可以实现了,但是三维如何实现呢? 我记得以前了解过一个小故事,应该就是分治的. 一个皇帝,想给部下分配任务,但是部下太多 ...

  9. 高级PHP开发:利用PHPEMS搭建在线考试平台

    今天给大家分享一个小技巧,就是利用PHP ems搭建在线考试平台:希望能给你给予帮助: 在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛 ...

  10. Websocket 群聊功能

    websocket 群聊 前提关闭防火墙 写入代码 from flask import Flask,request,render_template from geventwebsocket.handl ...