有一段实践没有写东西了,最近组里面来了两个新的小伙伴,并且一起针对目前的hbase集群做了一些运维和优化实践,比较零散,记录下来供以后以及和大家参考。
1,hbase regionserver宕机导致集群状态不一致问题处理和原因调研
问题:region server因oom被kill后,通过hack检查,发现集群中某些表出现不一致,不一致信息如下:
Region XXX not in Meta, but deployed on XXXX。
诊断:正常情况下regionserver宕机系统不应该出现状态不一致,查看不一致region对应的hdfs目录,发现对应region的目录大小为空,也就说对应region不在meta表中,但是在某台机器上deploy了,而且没有数据。怀疑是master中内存中保存的region状态和其他表不一致,导致在regionserver宕机时,region转移到其他机器的时候,使用了脏的master内存信息。重启master以后,删除对应的hdfs目录。问题得以修复。
2,jruby脚本运维hbase
问题:业务线将日志明细塞入hbase,以便查询最近系统状态的详情,在hbase中该表设置一个TTL,但是写入量巨大。hbase在做major compaction的时候会将过期的数据删除,但是自动split的region信息去没有自动删除。
诊断:通过写jruby脚本,类似在hbase shell中调用merge_region函数来定时合并region。脚本部分代码如下:
require 'java' require 'date' import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.client.HBaseAdmin config = HBaseConfiguration.create admin = HBaseAdmin.new config regionsInfo = admin.getTableRegions(‘xxxx'.to_java_bytes) preRegionInfo = nil sixDaysAgo = (Date.today - 6).strftime("%Y%m%d").to_s #puts sixDaysAgo maxMergeNum = 200 mergedNum = 0 grap = 3 for regionInfo in regionsInfo: #puts regionInfo curStartKey = java.lang.String.new(regionInfo.getStartKey()) curEndKey = java.lang.String.new(regionInfo.getEndKey()) # puts curEndKey if not curEndKey.equals("") and not curStartKey.equals("") # not the last regionInfo regionEndTime = curEndKey.split("_")[2].to_java regionStartTime = curStartKey.split("_")[2].to_java if regionStartTime.compareTo(sixDaysAgo) < 0 and regionEndTime.compareTo(sixDaysAgo) < 0 and grap > 2: preRegionEncodeName = preRegionInfo.getEncodedName() curRegionEncodeName = regionInfo.getEncodedName() puts preRegionEncodeName puts curRegionEncodeName, java.lang.String.new(regionInfo.getStartKey()), java.lang.String.new(regionInfo.getEndKey()) puts "******************" mergedNum = mergedNum + 1 admin.mergeRegions(preRegionEncodeName.to_java_bytes, curRegionEncodeName.to_java_bytes, false) grap = 0 sleep 10 end end grap = grap + 1 preRegionInfo = regionInfo #if java.lang.String.new(regionInfo.getStartKey()).equals("") # preRegionInfo = regionInfo #end #break if mergedNum >= maxMergeNum break end end
3,是用jsp动态获取集群信息以及操控
可以利用jps页面直接获取master或者regionserver实时信息,具体操作如下:
a, copy zk.jsp文件到hbase-webapps/master, 保存文件为xx.jsp
b, 重启master
c, 访问master:16010/xx.jsp, 可以获取zookeeper的相关信息。
4,DIFF编码和压缩
问题:hbase中表占用的存储空间越来越来,希望减少hbase表占用空间。
方案:表级别enable DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => ‘LZO’ 属性,通过测试发现添加这个两个选项以后,空间能够减少9倍左右。
小结
本文主要记录下最近hbase的一些实践,另外基于opentsdb的hbase监控系列,打算有空再开篇描述下。