Region是HBase的资源管理单位,在Region的生命周期内,一个Region迁移会发生在如下的情况下:
1)HMaster的Load Balance,造成部分Region在RS之间迁移。默认使用了
org.apache.hadoop.hbase.master.DefaultLoadBalancer,仅仅考虑RS上Region个数的分配的均衡性。
2)Region Split过程。这部分内容可以参考
http://blog.sina.com.cn/s/blog_4a1f59bf01018tu4.html
3) RS Offline过程-〉LOG Split过程-〉Region迁移。
在如上的过程中都会涉及到Region的迁移,那么Region的迁移又要经过哪些过程呢?
为了节省文章空间,我们以HMaster的Load Balancer为例来说明。
1)HMaster启动LoadBalancer线程。balancer的period由hbase.balancer.period控制,默认是300s。
int balancerPeriod = master.getConfiguration().getInt("hbase.balancer.period", 300000); |
2)关闭了BalancerSwitch、有Region处于In-Transition状态、或者RS下线的处理流程还没有走完,在这三种情况下,HMaster会停止执行Balancer过程。
3)由AssignmentManager获取每个Table的分布关系,由balancer为Region制定RegionPlan。对于DefaultLoadBalancer的实现,基本思想就是按照Region个数对于RS进行排列,首先按照Region个数多少进行排列,计算出Overload的RS需要回收的Region的个数,然后取出underload的RS中Region的个数。为了保证随机性,采取了再次打散underload RS,重组成RegionPlan(Region, RS-src,RS-dest)。
4) AssignmentManager 按照RegionPlan的要求,会执行unassign过程。在AssignmentManager的设计中,是一个由Zookeeper上hbase Node为仲裁者,RS与HMaster状态共享的过程状态机。
在AssignmentManager上提供了对于unassigned、splitlog等zk路径的Watcher,在HMaster、RS对于相应的Region状态的操作(Split)和迁移操作时,会在相应阶段时,修改对应zk路径的状态,这种节点下路径状态的改变,会被AM捕获,并启动下一个处理过程,从而最终完成处理操作。下面,我们已balancer过程来分析一下:
- HMaster 生成RegionPlan
- AM在ZK下unassigned路径下新建节点A,并标识A的状态为M_ZK_REGION_CLOSING
- AM通过RPC调用RS->CloseRegion
- RS完成Region关闭之后,修改节点A的状态为M_ZK_REGION_CLOSED
- AM的Zookeeper Watcher监听到Node A的变化,执行ClosedRegionHandler的处理
- AM修改节点A的状态从M_ZK_REGION_CLOSED到M_ZK_REGION_OFFLINE,根据RegionPlan,执行assignRegion操作
- AM通过RPC调用RS-〉openRegion操作
- RS转换节点A的状态为RS_ZK_REGION_OPENING
- RS执行openRegion操作
- RS执行完毕之后,修改节点A的状态从RS_ZK_REGION_OPENING到RS_ZK_REGION_OPENED
- AM执行OpenedRegionHandler处理,删除节点A。
- 到此,整个操作结束。
通过上面的过程,我们可以看到一个Region迁移过程,涉及到多次与ZK的操作,并且如果RegionPlan涉及到RS-src和RS-dest出现问题时,还有复杂的容错逻辑。因此,不得不说AM是HBase稳定性的关键。
问题:
在我们的大规模的应用测试中,发现了个别异常的Region。
首先,介绍发现这个问题的来由。在线上读写请求出现个别操作失败,并且失败的请求指向同一个Region A,因此,检查该Region A的位置,指向了host1,然而进入host1的onlineRegion列表中,却没有发现该Region,因此,此时出现Region不匹配的问题。更名为Region空洞。
在互联网应用中,有一个共性是,找问题比解决问题要难。只要定位到了问题,根据上面对于AM、RS、HMaster之间Region迁移的理解,很容易发现是Region迁移过程中出现了一次事故,造成了空洞现象。
我的解决方法就是增加一个定时触发的监控程序,去检查.META.表中记录的Region位置(RS)是否与RS对应上,如果RS上onlineRegion,不存在该Region,则就报警,并尝试进行unassign操作。核心代码如下:
HTable table = new HTable(HBaseConfiguration.create(), args[0]); HBaseAdmin admin = new HBaseAdmin(HBaseConfiguration.create()); ClusterStatus cs = admin.getClusterStatus(); Map regions = table.getRegionLocations(); if (regions != null && regions.size() > 0) { for (Map.Entry hriEntry : regions.entrySet()) { HRegionInfo regionInfo = hriEntry.getKey(); HServerLoad load = cs.getLoad(ServerName.parseServerName(hriEntry.getValue().getServerName())); if ( load != null && load.getRegionsLoad().get(regionInfo.getRegionName()) != null ) { System.err.println(Bytes.toStringBinary(regionInfo.getRegionName()) + " " + hriEntry.getValue().getServerName()); } else { System.out.println(Bytes.toStringBinary(regionInfo .getRegionName()) + " is Region Hole, and try to reassign again."); RegionAssigner.assign(regionInfo.getRegionName()); } } } |
将该程序放入crontab中,定时检查监控,并有Region重新部署功能。
From Binospace, post HBase监控之Region空洞
文章的脚注信息由WordPress的wp-posturl插件自动生成
相关推荐
hbase监控工具hbtop CDH6.3.2版本,用于监控表、namespace的访问情况,可快速定位问题
Hbase和Hadoop JMX监控实战
Zabbix监控Hbase集群时用到的文件,可配合本人写的文章进行部署。
1、region 拆分机制 ...当region大小大于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分,一个region等分为2个region。 但是在生产线上这种切分策略却有相当大的弊端:切分策略对于大表和小表没有
关于HBase集群监控在java代码中的实现操作,供大家参考
hbase-region-inspector, HBase区域统计信息的可视化仪表板 hbase-region-inspectorHBase区域统计信息的可视化仪表板。 用法下载与HBase集群版本匹配的可执行二进制插件,添加execute权限,并使用以下命令行参数启动...
HBASERegion数量增多问题描述及解决方案.docx
Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,也必然是所有分布式系统追求无限扩展性的一副良药。HBase系统中Region自动切分是如何实现的,这里面涉及很多知识点,比如Region切分的触发条件是什么、...
课时11:Observer协处理器实战之Region级别原理剖析 课时12:Observer协处理器实战之表复制应用实战 课时13:Endpoint协处理器实战之原理剖析 课时14:Endpoint协处理器实战之数据统计应用实战 课时15:使用API管理...
java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行
基于HBase的车辆监控系统,王仁阳,孙文生,随着智能交通的发展,机动车辆的数量日益增长以及车辆的运行数据的累积,使用传统关系型数据库的车辆监控系统的性能逐渐下降,并
2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. ...
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非...
HBase性能监控及最佳实践.pptx
java操作Hbase之从Hbase中读取数据写入hdfs中源码,附带全部所需jar包,欢迎下载学习。
HBase性能监控及最佳实践.pdf
1. HBase有哪些基本的特征? 1 HBase特征: 1 2. HBase相对于关系数据库能解决的问题是什么? 2 HBase与关系数据的区别? 2 HBase与RDBMS的区别? 2 3. HBase的数据模式是怎么样的?即有哪些元素?如何存储?等 3 1...
HBase实践之MOB使用指南(未翻译)
HBase在不同版本(1.x, 2.x, 3.0)中...目前HBase提供了大量的metrics用于监控,其中有哪些是要特别关注的?线上不同类型的问题应该重点查看哪些metrics来定位问题?如何结合metrics和客户端/服务端日志快速定位问题?