• 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监控系列,打算有空再开篇描述下。

  • 相关阅读:
    副本集-Replica Sets
    SpringBoot整合SpringData MongoDB
    Auth认证
    Form
    flask一些插件
    SQLAlchemy
    session
    上下文
    flask路由
    Flask中间件
  • 原文地址:https://www.cnblogs.com/superhedantou/p/7258585.html
Copyright © 2020-2023  润新知