Region的概念

Region是HBase数据管理的基本单位。数据的move,数据的balance,数据的split,都是按照region来进行操作的。

region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。

一个表中可以包含一个或多个Region。

每个Region只能被一个RS(RegionServer)提供服务,RS可以同时服务多个Region,来自不同RS上的Region组合成表格的整体逻辑视图。

regionServer其实是hbase的服务,部署在一台物理服务器上,region有一点像

关系型数据的分区,数据存放在region中,当然region下面还有很多结构,确切来

说数据存放在memstore和hfile中。我们访问hbase的时候,先去hbase系统表查找

定位这条记录属于哪个region,然后定位到这个region属于哪个服务器,然后就到

哪个服务器里面查找对应region中的数据

每个region有三个主要要素:

它所属于哪张表

它所包含的的第一行(第一个region没有首行)

它所包含的最后一行(末一个region没有末行)

当表初写数据时,此时表只有一个region ,当随着数据的增多,region开始变大,等到它达到限定的阀值大小时,变化把region分裂为两个大小基本相同的region,

而这个阀值就是storefile的设定大小(参数:hbase.hregion.max.filesize新版本默认10G) ,在第一次分裂region之前,所有加载的数据都放在原始区域的那台服务器上,随着表的变大

region的个数也会相应的增加,而region是Hbase集群分布数据的最小单位。

(但region也是由block组成,具体这个block和hdfs block什么样的关系后面再说,region是属于单一的regionserver,除非这个regionserver宕机,或者其它方式挂掉,再或者执行balance时,才可能会将这部分region的信息转移到其它机器上。)

*这也就是 为什么region比较少的时候,导致region分配不均,总是分派到少数的节点上,读写并发效果不显著,这就是hbase读写效率比较低的原因。

Region的结构

1 层级结构

·Table (HBase 表)

·Region(表的Regions)

oStore(Region中以列族为单位的单元)

§MemStore (用于写缓存)

§StoreFile (StoreFiles for each Store for each Region for the table)

§Block (读写的最小单元)

2 重要成员

2.1 Region

Region是HBase数据存储和管理的基本单位

2.1.1 Region的数量设计

设计的本意是每个Server运行小数量(2-200)个大容量(5-20Gb)的Region,理由如下:

·每个MemStore需要2MB的堆内存,2MB是配置的,假如有1000拥有两个列族的Region,那么就需要3.9GB的堆内存,还是没有存储任何数据的情况下

·HMaster要花大量的时间来分配和移动Region

·过多Region会增加ZooKeeper的负担

·每个Region会对应一个MapReduce任务,过多Region会产生太多任务

2.1.2 Region的分配

2.1.2.1 启动时的分配步骤

Master启动时调用 AssignmentManager。

AssignmentManager查看hbase:meta中已经分配好的Region

如果Regiond的分配依然有效的话 (如果RegionServer 仍然在线的话) 维持当前分配

如果分配失效,LoadBalancerFactory会被调用来分配region. 负载均衡器(HBase1.0默认使用StochasticLoadBalancer) 分配任务到RegionServer中

如果需要的话,RegionServer分配信息会更新到hbase:meta中。RegionServer启动时调用启动代码来启动region。

2.1.2.2 RegionServer失效时的分配步骤

1.Region Server挂掉后它上面的regions变得不可用。

2.Master检测到Region Server挂掉了。

3.失效Region Server上的region分配会被认为无效并采用跟启动时同样顺序的步骤分配region

4.正在进行的查询操作会重新执行,不会丢失

5.切换动作要在以下时间内完成:

ZooKeeper session timeout + split time + assignment/replay time

2.1.3 Region的位置选择

Region的位置选择通过HDFS的复制机制完成

1)步骤:

1.第一个副本写在本地节点

2.第二副本写到另一个机上任意节点

3.第三个副本写到跟第二副本相同机架不同节点的其他节点

4.后面的副本将写到集群中的任意节点中。

2)要点:

·选址是在flush或者compaction之后执行的

·当RegionServer失效后,其上的Region被转移到其他的RegionServer,那么此时被转移的Region不具备数据本地性,直到下一次compaction执行之后才重新具备数据本地性

2.1.4 Region的切分

·当Region的大小达到指定的阀值时,RegionServer会执行Region的切分

·该操作有RegionServer单独执行,Master不参与

·分裂执行完毕后,会将子Region添加到hbase:meta并且汇报给Master

·可以自定义切分策略,可以在hbase-site.xml设置

org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy

·支持手动执行切分

·可以指定切分点

2.1.5 Region的合并

2.1.5.1 意义

·当存在大量没有数据的region时,执行region的合并来避免region过多

·之所以会存在大量没有数据的region是因为为了避免region到达阀值引起分裂的开销,创建表格时先进行预分区。

2.1.5.2 步骤

1.客户端发送指令给Master

2.Master收到指令后将要合并的region移动到指定的RegionServer

3.Master发送Merge请求给指定的RegionServer执行合并操作

4.最后将被合并的regions从hbase:meta中删除并添加合并后的region

2.2 Store

·以列族为单元,即对应表中每个region中一个列族

·包含一个MemStore和0到多个StoreFile(HFile)

2.2.1 MemStore

·将修改信息缓存在内存当中

·信息格式为Cell/KeyValue

·当flush触发时,MemStore会生成快照保存起来,新的MemStore会继续接收修改信息,指导flush完成之后快照会被删除

·当一个MemStore flush发生时,属于同一个region的memStore会一起flush

2.2.2.1 MemStore Flush的触发情况

·MemStore的大小达到单个MemStore阀值

·RegionServer中所有MemStore的使用率超过RS中MemStore上限值,该Server上所有MemStore会执行flush直到完成或者小于RS中MemStore安全值

·RegionServer中WAL超过WAL阀值

单个MemStore阀值:hbase.hregion.memstore.flush.size

RS中MemStore上限值:hbase.regionserver.global.memstore.upperLimit

RS中MemStore安全值:hbase.regionserver.global.memstore.lowerLimit

WAL阀值:hbase.regionserver.max.logs

2.3 StoreFile/HFile

2.3.1 格式

2.3.1.1 概念:

·Data Block Size:数据块大小。默认为64KB。因为查询key是按照顺序查询的,所以需要选择合适的Size来避免一个Block包含过多Key/Value对。

·Maximum Key Length:最大key长度。10-100字节是比较合适的大小,key的形式:rowkey+column family:qualifier+timestamp

·Maximum File Size:最大File大小。Trailer、File-Info和Data-Index都会在读取和写入时存到内存中,所以最好保证File的大小在合理的范围,避免占用过多内存。

·Compression Algorithm:压缩算法。

·好处:

o减少磁盘I/O

o提高传输效率和减少磁盘空间

o减少读取请求的返回量

·支持的压缩库

oGZ

oLZO

2.3.1.2 HFile 结构

结构图如下:

HFile结构图

Trailer结构

·Data Block:存储键值对的长度和值

·Meta Block:用户定义元数据

·File Info:关于HFile的元数据

·Data Index:Data Block的索引,也就是每个Block的第一个Key的偏移量

·Trailer:固定的源数据,用于存储以上每个部分的偏移量,读取HFile时首先要读取Trailer。

2.3.2 KeyValue

KeyValue以字节数组的形式存储,包含以下部分:

·keylength

·valuelength

·key

·value

Key的格式如下:

·rowlength

·row (也就是the rowkey)

·columnfamilylength

·columnfamily

·columnqualifier

·timestamp

·keytype (例如 Put, Delete, DeleteColumn, DeleteFamily)

2.4 Scan 步骤

1.当客户端提交scan请求时,HBase会创建为每个Region创建RegionScanner 实例来处理scan请求

·RegionScanner 包含一组StoreScanner实例,每个列族对应一个StoreScanner实例

·每个StoreScanner实例包含一组StoreFileScanner实例, 每个toreFileScanner实例对应每个列族的HFile, 同时包含一组对应MemStore的KeyValueScanner。

·The two lists are merged into one, which is sorted in ascending order with the scan object for the MemStore at the end of the list.

·当StoreFileScanner实例被构造, 会生成MultiVersionConcurrencyControl 读取点, 就是当前的memstoreTS, 用来过滤掉

2.5 Compaction

2.5.1 Minor Compaction(次压缩)

HBase会自动挑选小的临近的HFiles将它们重新写到一些大的HFiles中。这个过程称为次压缩。次压缩通过将更小的files写到一些大的flies进行合并操作来实现减少file的数量。

2.5.2 Major Compaction(主压缩)

·合并一个Region中每一个列族的所有HFile写到一个HFile中

·会删除掉那些标记删除和过期的cells。提高了读取性能

·将所有数据进行了重写,产生大量的I/O开销或者网络开销,称为写放大

·自动执行,通常安排在周末或者晚上

2.6 Region 负载均衡

当region分裂之后,RS之间的region数量差距变大时,HMaster便会执行负载均衡来调整部分region的位置,使得每个RS的region数量保持在合理范围之内,负载均衡会引起region的重新定位,使得涉及的region不具备数据本地性,即HFile和region不在同一个DataNode。这种情况会在major compaction 之后得到解决。

HBase Region重点剖析的更多相关文章

  1. 【原创】大叔问题定位分享(13)HBase Region频繁下线

    问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...

  2. [转] An In-Depth Look at the HBase Architecture - HBase架构深度剖析

    [From] https://mapr.com/blog/in-depth-look-hbase-architecture/ In this blog post, I’ll give you an i ...

  3. 【转】HBASE Region in Transition issue on Master UI

    [From]https://community.hortonworks.com/content/supportkb/244808/hbase-region-in-transition-issue-on ...

  4. Hbase region 某个regionserver挂掉后的处理

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwoAAACdCAMAAAAjbX91AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK

  5. hbase region 分配方式

    参与 Region 分配的重要对象 在 Region 分配过程中,起着重要作用有如下一些对象. HMaster— 是 HBase 中的 Master server ,仅有一个. HRegionServ ...

  6. HBase Region级别二级索引

    我们会经常谈及二级索引,这是对全表数据进行另外一种方式的组织存储,是针对table级别的.如果要为HBase上的表实现一个强一致性的二级索引,那么就无法逃避分布式事务,而这一直是用户最期待的功能. 而 ...

  7. HBase Region合并分析

    1.概述 HBase中表的基本单位是Region,日常在调用HBase API操作一个表时,交互的数据也会以Region的形式进行呈现.一个表可以有若干个Region,今天笔者就来和大家分享一下Reg ...

  8. hbase region still in transition

    1,删除hbase中的 hbase:meta表中相应的region的row 如; get 'hbase:meta','kylin_metadata,,1481101316881.f3b4c7c1148 ...

  9. HBase Region 各个状态的转换

    Region 各个状态的转换 HBase 维护了每个 region 的一个状态信息,并保存在 hbase:meta 中.hbase:meta 本身region的状态信息被持久化到 ZooKeeper. ...

随机推荐

  1. UNITY VR 视频/图片 开发心得(二)

    上回说到了普通的全景图片,这回讲真正的VR. 由于这种图片分为两部分,所以我们需要两个Camera对象以及两个球体.首先新建一个Camera对象,并将其命名为RightEye(其它名字也无妨,只要你自 ...

  2. jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身)

    jq自定义下拉菜单,在点击非当前下拉菜单区域时,关闭下拉菜单(点击事件的对象不是目标元素本身) //点击非当前下拉菜单区域时,关闭下拉菜单 $(document).mousedown(function ...

  3. Winform入门见解

    winform算是C#比较快速的入门的一个了,简单的控件拖拽然后写上每个控件对应的事件.然后就可以了.需要美观的点 可以用Skin皮肤就完成了.我们先不说复杂的,就来个普通的三层架构来增删改查 分页和 ...

  4. Win8Metro(C#)数字图像处理--2.26图像减法

    原文:Win8Metro(C#)数字图像处理--2.26图像减法  [函数名称] 图像减法函数SubtractionProcess(WriteableBitmap src, WriteableBi ...

  5. WPF判断两个PNG图片是否碰撞

    这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...

  6. Linux下获取arm的交叉编译工具链

    转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...

  7. Inno Setup制作最简单的安装程序

    目标就是[把exe程序放到制定目录,然后自动把工程需要的dll放到system32目录下,自动注册注册表.] 实现上述需求,用Inno Setup可以非常方便快捷实现. 安装Inno Setup. 点 ...

  8. C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。

    原文:C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> ...

  9. Hadoop中重要概念简要总结

    Hadoop是一个利用大规模计算机集群,可处理大量数据的分布式并行框架. Hadoop 官网 Hadoop的核心设计包括HDFS和MapReduce. HDFS HDFS(Hadoop Distrib ...

  10. 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)

    很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...