Region详解

Region,图片来自Map-R

1 层级结构

  • Table (HBase 表)
  • Region(表的Regions)
    • Store(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 启动时的分配步骤

  1.  Master启动时调用 AssignmentManager。
    
  2.  AssignmentManager 查看hbase:meta中已经分配好的Region
    
  3.  如果Regiond的分配依然有效的话 (如果RegionServer 仍然在线的话) 维持当前分配
    
  4. 如果分配失效,LoadBalancerFactory 会被调用来分配region. 负载均衡器(HBase 1.0默认使用StochasticLoadBalancer ) 分配任务到Region Server中
    
  5.  如果需要的话,Region Server分配信息会更新到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. 后面的副本将写到集群中的任意节点中。
副本,图片来自Map-R

2)要点:

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

2.1.4 Region的切分

  • 当Region的大小达到指定的阀值时,RegionServer会执行Region的切分
  • 该操作有RegionServer单独执行,Master不参与
  • 分裂执行完毕后,会将子Region添加到hbase:meta并且汇报给Master
  • 可以自定义切分策略,可以在hbase-site.xml设置
<property>
  <name>hbase.regionserver.region.split.policy</name>
  <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
</property>
  • 支持手动执行切分
  • 可以指定切分点
Region 分裂,图片来自Map-R

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:压缩算法。
  • 好处:
    • 减少磁盘I/O
    • 提高传输效率和减少磁盘空间
    • 减少读取请求的返回量
  • 支持的压缩库
    • GZ
    • LZO

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格式

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的数量。


Minor Compaction,图片来自Map-R

2.5.2 Major Compaction(主压缩)

  • 合并一个Region中每一个列族的所有HFile写到一个HFile中
  • 会删除掉那些标记删除和过期的cells。提高了读取性能
  • 将所有数据进行了重写,产生大量的I/O开销或者网络开销,称为写放大
  • 自动执行,通常安排在周末或者晚上
Major Compaction,图片来自Map-R

2.6 Region 负载均衡

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


负载均衡,图片来自Map-R

参考文章:
HFile: A Block-Indexed File Format to Store Sorted Key-Value Pairs
Apache HBase ™ Reference Guide
An In-Depth Look at the HBase Architecture

若有侵权,请联系我。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 148,637评论 1 318
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 63,443评论 1 266
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 99,164评论 0 218
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,075评论 0 188
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,080评论 1 266
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,365评论 1 184
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,901评论 2 283
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,649评论 0 176
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,122评论 0 223
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,734评论 2 225
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,093评论 1 236
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,548评论 2 222
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,028评论 3 216
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,765评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,291评论 0 178
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,162评论 2 239
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,293评论 2 242

推荐阅读更多精彩内容