HBase是以Region为最小的存储和负载单元(这里可不是HDFS的存储单元),因此Region的负载管理,关系到了数据读写的性能。先抛开Region如何切分不说,看看Region是如何分配到各个RegionServer的吧。

更多内容参考——我的大数据学习之路

Region在HBase中的角色

Table                    (HBase表)Region               (Region)Store            (每个Region的每个列族独立存储)MemStore     (MemStore每个Store有一个,用于在内存中保存数据)StoreFile    (StoreFiles对应于Store,是具体存储在磁盘的文件)Block    (Blocks是HDFS上的存储单元)

Region的管理

一般来说对于每个Region Server,官方推荐最好是控制Region的数量在20-200个、大小在5-20Gb左右。

为什么要控制region的数量呢?

  1. 默认MemStore需要2MB的空间用来存储数据,如果一台机器上有1000个Region,每个有两个列族,那就需要3.9GB的数据。
  2. 如果同时以某个相同的频率更新所有的Region,当同时进行数据持久化的时候也会有问题
  3. Master对于维护大量的Region有很大的性能问题,因为在平衡Region的时候,在ZK中的操作都是同步的。
  4. Region Server需要维护Region的索引信息

那么Region Server是如何管理Region的呢?

启动

  1. Master创建AssignmentManager
  2. AssignmentManager查看当前的Region分配信息
  3. 满足条件后,通过LoadBalancerFactory创建LoadBalancer,1.0后的版本默认是StochasticLoadBalancer
  4. 判断是否需要进行负载平衡,并更新相关信息

容错

  1. 如果平衡负载的时候报错,RegionServer会直接关闭
  2. Master检测到resgion Server异常
  3. 重启Region server
  4. 请求进行重试;超时会请求其他的节点

Region的状态机

Hbase中每个Region自己维护其在hbase:meta表中的信息。

状态机中包括下面几种状态:

  • offline:region离线没有开启
  • opening:region正在被打开
  • open:region正在打开,并且region server通知了master
  • failed_open:regionserver打开失败
  • closing:region正在被关闭
  • closed:regionserver正在关闭,并且已经通知了master
  • failed_close:regionserver关闭失败了
  • splitting:region server通知master,region正在被切分
  • split:region server通知master,region已经被切分完了
  • spliting_new:region是切分过程中新建的文件
  • merging:regionserver通知master region正在合并
  • merged:regionserver通知master region合并完了
  • merging_new:region是合并新建出来的

不同的颜色是不同含义:

  • 棕色:离线状态,属于一种短暂的瞬间状态(比如关闭后开启的中间状态)、停止状态或者初始化的时候的状态
  • 绿色:正常的状态,可以支持请求访问
  • 蓝色:短暂的状态
  • 红色:失败
  • 黄色:合并或者切分的状态
  • 灰色:刚开始的状态

各个序号代表不同的操作场景:

  1. Master向region server发起region从offline到openning的状态请求,regionserver如果没有收到,master会尝试重试几次。RegionServer接收到请求后,regin状态变成opening
  2. 如果Master发起的open请求超过次数,那么无论region server是否已经打开region,master都会命令region server关闭文件,状态变为closing
  3. 当region server打开region后,会尝试通知master,让他把region状态修改为open,并通知regsion server。这样region才能变为open状态
  4. 如果region server打开四百,会尝试通知master。master会把region的状态变更为closed,并且尝试去其他的region server打开region
  5. 如果master尝试几次后,都没有打开region,就会把状态变更为failed_open
  6. master通知region server关闭region,如果没有反应,会重试
  7. 如果region server没有在线,会抛出异常。然后region的状态会变成closing
  8. 如果region server在线,但是好几次都没响应,就会更新状态为failed_close
  9. 如果region server收到请求,并且关闭了region,那么会通知master把region状态修改为closed。并且把region分配给其他的server
  10. 在分配之前,master会先把region从closed状态转换为offline
  11. 如果region server正在切分region,会通知mastere。master把region状态由open变为splitting,并且把新增两个region的信息,这两个region都是splitting_new状态
  12. 如果region切分成功,当前的region状态从splitting变成split;新增的两个region状态从splitting_new变成open
  13. 如果切分失败,状态从splitting回到open,两个region也从splitting_new变成offline
  14. 如果region server想要合并两个region,那么也会先通知master。master把两个region从open变成merging,然后增加一个新的region,状态为merging_new
  15. 如果合并成功, 旧的region从merging变为merged,新的region从merging_new变为open
  16. 如果合并失败,region的状态从merging变回open,新建的一个region状态又变成offline
  17. 如果管理员通过hbase shell操作分配region,master会尝试把失败的状态变成close

Region的数据本地性

数据本地性通过来自于hdfs client和hdfs block存储的节点差异性,针对数据备份来说,会按照下面的机制进行:

  1. 第一个备份会优先卸载本地node节点上
  2. 第二个备份会随机选择一个不同的机架
  3. 第三个备份会在第二个备份所在的机架上,再随机选择一个节点
  4. 如果还有其他的备份节点,就在集群中随机选择了。

这样Hbase在刷新或者压缩时,可以体现数据的本地性。如果一个region server出现故障,那么就没有数据本地性可言了,因为它的备份都在其他的节点上。

Region的切分

HBase会配置一个切分的阈值,当到达阈值后,就会执行region的切分。Master不会参与Region的切分,切分由Region Server独立完成。执行切分的时候,会先把region下线,然后在meta表中增加子region的信息,最后通知给master。

默认使用的切分策略是IncreasingToUpperBoundRegionSplitPolicy(1.2.0版本),通过修改配置可以切换切分规则:

<property><name>hbase.regionserver.region.split.policy</name><value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
</property>

也可以通过Admin API指定规则:

HTableDescriptor tableDesc = new HTableDescriptor("test");
tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, ConstantSizeRegionSplitPolicy.class.getName());
tableDesc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf1")));
admin.createTable(tableDesc);

或者通过HBase shell管理:

hbase> create 'test', {METHOD => 'table_att', CONFIG => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy'}},
{NAME => 'cf1'}

也可以通过HBaseConfiguration来配置:

HTableDescriptor myHtd = ...;
myHtd.setValue(HTableDescriptor.SPLIT_POLICY, MyCustomSplitPolicy.class.getName());

Region的手动切分

Region的切分可以在表创建的时候来执行,也可已在后期来做。最好是在设计表结构的时候,就把切分的规则考虑进去。因为:

  • 如果你的数据rowkey是随着时间自增长的,那么所有的新数据都会写在最后一个Region中,这样会导致总是最后一个region是热点,而其他的所有region基本都闲置了。
  • 有的时候是一些意外的情况导致的热点问题,比如table中存储的是每个网页对应的点击日志,如果一个网页很受欢迎,那么它对应的region将会成为热点。
  • 当集群的region很多的时候,想要加快加载数据的速度
  • 在批量导入的时候,可能会造成region热点写

设计切分点

默认HBase都是基于Rowkey的字符进行切分的。如果rowkey是通过数字开头,那么会按照数字的范围进行切分;如果是字母,则会通过它的ASCII码进行切分。用户也可以自定义切分的算法,比如HexStringSplit通过转换成十六进制进行切分。

Region的合并

Master和RegionServer都会参与Region的合并。一般是Client发送合并的请求到Master,然后Master把需要合并的region移动到需要移动比例最高的那个Regsion Server上。比如现在有ABC3个Region Server,A有2个Region,B和C都只有一个,那么会把Region都转移到A Server,再执行合并操作。跟切分的过程一样,也需要先将region设置离线,然后执行合并,再去更新meta表信息。

下面是Hbase shell中合并的例子:

$ hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'
$ hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME', true

合并操作是异步操作,发送请求后,客户端这边不需要登到合并结束。

第三个参数,表示是否强制合并。因为默认合并操作只能针对相邻的region,force参数可以强制跨Region的合并。

HBase官方文档 之 Region的相关知识相关推荐

  1. HBase 官方文档

    HBase 官方文档 Copyright © 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Revision ...

  2. 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识

    以下链接可查看 11g 到 20c 的在线官方文档. https://docs.oracle.com/en/database/oracle/oracle-database/index.html 如图, ...

  3. 反正你们写的都是没有即时演示的鸡肋教程,我为什么不去看官方文档?

    By Conmajia 我就拿Vue举个栗子. Vue.js是什么,我想你多半知道,我也甭废话了. 这几天看到写Vue教程的文章突然多起来了.不过,就我所见,在这里发表的所有教程文章,都不支持即时演示 ...

  4. [HBase进阶]--rowkey设计要点(官方文档介绍)

    官方文档说明 http://hbase.apache.org/book.html#rowkey.design 一.Hotspotting(热点效应) 1.hbase是字典排序,这是一种优化扫描的方式, ...

  5. Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分

    Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...

  6. 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)

    转载自:https://www.jianshu.com/p/d533c69be034 由于微信官方文档对此的描述虽然还可以,但是还是有一些让人疑惑的地方,所以笔者做了一些注解,希望对大家有所帮助 为什 ...

  7. CDH6官方文档中文系列(8)----Cloudera升级指南

    Cloudera升级指南 最近在学习cdh6的官方文档,网上也比较难找到中文的文档. 其实官方英文文档的阅读难度其实并不是很高,所以在这里在学习官方文档的过程中,把它翻译成中文,在翻译的过程中加深学习 ...

  8. spark之4:基础指南(源自官方文档)

    spark之4:基础指南(源自官方文档) @(SPARK)[spark, 大数据] spark之4基础指南源自官方文档 一简介 二接入Spark 三初始化Spark 一使用Shell 四弹性分布式数据 ...

  9. Gora官方文档之二:Gora对Map-Reduce的支持

    参考官方文档:http://gora.apache.org/current/tutorial.html 项目代码见:https://code.csdn.net/jediael_lu/mygoradem ...

最新文章

  1. 水系图一般在哪里找得到_一款支持智能抠图、钢笔抠图的在线抠图工具上线了 速抠图 sukoutu.com...
  2. 也议MySQL中隐式转换
  3. VS2015下OpenGL库的配置
  4. java 抽象类与接口区别是什么_JAVA中抽象类与接口的区别,分别在什么情况下使用它们...
  5. Intellij Idea插件利器推荐大全
  6. 2.移植uboot-添加2440单板,并实现NOR、NAND启动
  7. bzoj 5016: [Snoi2017]一个简单的询问(莫队)
  8. 56. Yii Modules
  9. rmt_redis.c:6446 ERROR: Can't handle RDB format version redis-migrate-tool迁移工具报错
  10. windows下载mysql太慢
  11. Html5实现植物大战僵尸小游戏
  12. mbedtls | 10 - 数字证书及 X.509 证书标准
  13. Unity(一)Scene和GameObject
  14. SpringBoot使用Quartz定时器实现Email信息轰炸
  15. 悦保车牌识别相机优势
  16. 齐大计算机与控制学院在哪个校区阮,齐齐哈尔大学各个学院所在校区做个介绍...
  17. C/C++编程:std::move(将左值强制转换为右值)
  18. Object类九大方法之notify和notifyAll方法
  19. 智慧城市产业热点板块及产业图谱
  20. 批一批淘宝首页的源代码

热门文章

  1. 戴尔服务器装新硬盘模式,DELL服务器安装过程中的三种模式AHCI, ATA, RAID
  2. 编写简单的中文分词程式-.NET教程,Asp.Net研发
  3. 开年迎喜讯:比格云与中信银行签订战略合作协议
  4. 维格云Word打印模版入门教程
  5. Oracle ODP.NET ConnectionString接池及连接参数
  6. VSC/SMC(八)——基于慢时变干扰观测器的滑模控制(含程序模型)
  7. 【高考季征文】高考那些事儿,作为过来人我有话要说
  8. 蓝桥杯模拟赛2(大学生组青少年组)赛后试题解析(C实现)
  9. C++ find()函数用法详解(超级详细)
  10. Win7 xp 双系统安装说明(转)