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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM