hbase最近的一些实践

有一段实践没有写东西了,最近组里面来了两个新的小伙伴,并且一起针对目前的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监控系列,打算有空再开篇描述下。

posted @ 2017-07-31 19:17  超级核弹头  阅读(1499)  评论(0编辑  收藏  举报