有一段實踐沒有寫東西了,最近組里面來了兩個新的小伙伴,並且一起針對目前的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監控系列,打算有空再開篇描述下。