HBase實踐 | HBase疑難雜症診治

hbase2.0處理rit狀態記錄web

日期shell

版本號apache

類別微信

描述
併發

2019-07-05app

1.0.0高併發

A工具

排查hbase2.0的rit問題oop

問題說明學習

因爲使用HDP3.0,HDP3.0使用的是hbase2.0.0版本,hbase的ui頁面發現不少表出現了rit,刪除表過程當中,region的狀態卡在了opening。先嚐試使用hbck2工具進行修復,發如今hbase2.0的master的rpc方法中沒有hbck2中的bypass,assign方法,經過源碼發現,hbck2的rpc方法是在hbase2.0.2中才增長的,因此只能嘗試手動處理:

一.hdfs上已經沒有對應目錄,meta裏沒有對應表狀態信息,存在有對應的分區信息

1. 檢查表狀態

get 'hbase:meta','KYLIN_0054K9NLSU','table:state'

結果爲空

2. 經過源碼發現表狀態

ENABLED,對應meta表裏的值\x80\x00
DISABLED, 對應meta表裏的值\x80\x01
DISABLING, 對應meta表裏的值\x80\x02
ENABLING, 對應meta表裏的值\x80\x03

3. 查找分區信息

scan 'hbase:meta',{FILTER => org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes('KYLIN_0054K9NLSU'))}

發現存在有分區記錄

4. 手動修改表狀態或者刪除分區信息

put 'hbase:meta','KYLIN_0054K9NLSU','table:state','\x80\x01'

或者deleteall 表對應的分區信息,修改後重啓hbase,發現rit狀態消失

二.hdfs上已經有對應目錄,meta裏有對應表狀態信息和分區信息

1. 確認一下表的信息和數據

hbase hbck -summary TableName

2. 檢查表狀態

get 'hbase:meta','KYLIN_0354K9NLSU','table:state'

meta表裏的值\x80\x02,表的狀態爲DISABLING

3. 找出異常的region

echo "scan 'hbase:meta',{FILTER => org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes('KYLIN_0354K9NLSU'))}"|hbase shell -n|grep OPENING

找出異常的region

4. 將region信息更新爲CLOSED狀態

put 'hbase:meta','KYLIN_0354K9NLSU,,1561953520536.30b7d24eaa3209c6e5e8de764ad04855.','info:state','CLOSED',1562117738678

………

5. 將表狀態更新爲disable

put 'hbase:meta','KYLIN_0354K9NLSU','table:state',"\x08\x01",1562120793251

重啓hbase後rit消失


存在問題

  • rit是刪除表的時候出現,因此表中的數據能夠忽略,上述操做也是表中沒有數據時操做

  • 若是是生成集羣,已經存在的數據比較多,不建議直接重啓,能夠經過切換master的方式

  • 可使用HDP3.1.1,裏面hbase版本是2.0.2,可使用hbck2操做

  • 使用hbck2的方法的話,修改meta狀態後還會同步改zookeeper狀態,能避免狀態不一致



HBase2.x之RIT問題解決

問題描述

Region-In-Trasition機制:從字面意思來看,Region-In-Transition說的是Region變遷機制,其實是指在一次特定操做行爲中Region狀態的變遷,例如merge、split、assign、unssign等操做。RIT問題指的是在RIT過程當中出現異常狀況,而後致使region的狀態一直保持在RIT,使得HBase出現異常。


解決方案

方案一

檢查hdfs的健康度,是否有hbase的文件丟失或損壞,運行命令hadoop fsck /,結果以下:

排除hdfs丟失block的問題。若是出現hdfs的block損壞或丟失的狀況,能夠經過hdfs的修復命令進行修復。

方案二

在HBase1.x系列中RIT問題一般能夠經過hbase  hbck –repair操做完成修復。可是在HBase2.x系列中,該命令尚未支持,因此暫時沒法經過這種命令完成修復。結果以下:

第一次執行發現沒有權限,root用戶不是hdfs的超級用戶,安裝提示須要以hbase用戶去執行該命令。修改以下:

su hbase -s /bin/sh -c "hbase hbck -repair"



提示爲hbase有其餘線程正在執行hbck fix命令,可是其實沒有這種命令,其實從這裏就能夠看出HBase2.x對於-repair的支持是不夠的。我按照提示刪除了hdfs(/hbase/.tmp/)上的hbase-hbck.lock文件,從新運行命令以下:

方案三

根據RIT狀態執行assign或者unassign命令,狀態信息以下:

通過查詢資料,解決方案以下:

hbase shell屢次執行unassign '20acfcbd68fd624a78bb34c88f9382d1'和unassign '20acfcbd68fd624a78bb34c88f9382d1' , true都超時結束,經過修改rpc和zk的超時時間都沒法完成(正常超時時間爲60000ms,修改成600000ms)。

方案四

通過屢次試驗,最終都沒法使得HBase回覆正常,最終決定刪除進行測試。

Zookeeper節點刪除:

經過hbase zkcli命令進入Zookeeper命令行界面:

我想刪除節點 /hbase-unsecure/region-in-transition,可是發現並無該節點,通過資料查詢瞭解到HBase2.x的RIT狀態並不像HBase1.x系列存儲在Zookeeper上。通過測試刪除/hbase節點重啓hbase並不能解決RIT問題。

HBase表刪除:

hbase shell>disable M_TDY_PT_LCZZ

disable失敗,因此正常刪除表操做沒法執行。須要進行暴力刪除,暴力刪除指的是從元數據進行刪除。

先停掉HBase

刪除hdfs表目錄(記得先備份,等下恢復用)

hdfs dfs -cp /hbase/data/hospital/P_TDY_DASC_DE02_01_039_63 /
hdfs dfs -cp /hbase/data/hospital/M_TDY_PT_LCZZ /
hdfs dfs -rm -r -skipTrash /hbase/data/hospital/P_TDY_DASC_DE02_01_039_63
hdfs dfs -rm -r -skipTrash /hbase/data/hospital/ M_TDY_PT_LCZZ
delete 'hbase:meta','rowkey''column'

Rowkey信息能夠經過hbase的UI看到:

而後重啓HBase,可是發現問題沒有解決。

hbase shell查詢數據看到hbase的meta刪除失敗了,本來的meta信息還在:

而後從新刪除(delete命令換成deleteall命令):

再刪除Zookeeper中的/hbase節點,重啓HBase發現RIT問題已經解決了。

後續就是重建表,而後恢復數據。


Phoenix故障處理筆記

1. Timeline

  • 06-26 16:00 Phoenix使用方反饋慢;

  • 06-26 16:02 同事經過監控看到Phoenix HBase集羣一個對應的RegionServer,QueueSize太高,此bug基本是Butch Put Lock在高併發寫入的問題,咱們已在下個版本中增長信息日誌定位此問題;

  • 06-26 16:05 同事重啓該隊列太高的RegionServer;

  • 06-26 16:10 同事跟我說,好多Phoenix的Region處於RIT狀態;

  • 06-26 17:00 暫停該Phoenix集羣全部的寫入;

  • 06-26 20:00 跟業務溝通,可能會正常影響一段時間,經贊成。至此各類hbck,各類重啓RegionServer&Master不怎麼管用,RIT數量升至550個;

  • 06-27 12:00 嘗試修復;

  • 06-27 15:00 問題修復。


2. 處理流程

2.1 異常現象

1. 大量Region沒法上線(NotServingRegionException)

2. Phoenix的SYSTEM.CATALOG系統表也沒法上線。

2.2 處理流程

  1. 手動assign SYSTEM.CATALOG 表的Region上線,而且跟蹤Master&對應RegionServer的日誌。整個offline&open流程都正常。可是中間會因爲各類其餘的表不在線failover後close掉;

  2. 打印jstack, 感受這幾個線程有問題,都在waiting;

  • 經過上面的信息看,open region確實有問題。查看Phoenix Indexer Observer源碼就會知道是在根據Recover WAL Entry構建索引;

  • 修改hbase.regionserver.executor.openregion.threads數,此配置是負責open region的handler數:

    <property>
        <name>hbase.regionserver.executor.openregion.threads</name>
        <value>50</value>
    </property>

    默認 3, 咱們這邊的hbase版本(1.0.0-cdh5.4.4)

  • 重啓RegionServer

  • assign SYSTEM.CATAOG 表的Region,上線成功;

  • 修修補補,fixMeta fixAssignments就ok了。


3. 原理分析

1. 重啓RegionServer, 會形成該RegionServer上面的Region下線,而且被從新Balance到新的RegionServer中。

2. Region在新的RegionServer中open過程會找到該Region下的recover.edits 文件,進行replay;

3.Phoenix表使用HBase的協處理類型之Observer,具體使用查看示例

org.apache.phoenix.hbase.index.Indexer,此用做根據WAL構建索引的,具體參考Phoenix的相關材料。

4. 在SYSTEM.CATALOG 的打開過程當中,會查詢其餘的裏面表,其餘的表也處於RIT未恢復。然而其餘的表Region在open的過程也須要構建Index,尚且有一部分在openregion的隊列里面。最終SYSTEM.CATALOG沒法上線(此處不準確,純屬囫圇吞棗似的查看源碼推測)。

5. 增長open region handler數以後,重啓RegionServer後,須要進行一些hbck -fixMeta -fixAssginment 將一些未上線的Region上線, 就ok了。

6. 若是出現個別的Region仍是上線失敗,那就手動解決吧!我的認爲比hbck -repair暴力修復靠譜。



你們工做學習遇到HBase技術問題,把問題發佈到HBase技術社區論壇http://hbase.group,歡迎你們論壇上面提問留言討論。想了解更多HBase技術關注HBase技術社區公衆號(微信號:hbasegroup),很是歡迎你們積極投稿。

本羣爲HBase+Spark技術交流討論,整合最優質的專家資源和技術資料會按期開展線下技術沙龍,專家技術直播,專家答疑活動

點擊連接釘釘入羣:

https://dwz.cn/Fvqv066s或掃碼進羣

本羣爲Cassandra技術交流討論,整合最優質的專家資源和技術資料會按期開展線下技術沙龍,專家技術直播,專家答疑活動

Cassandra 社區釘釘大羣:

https://c.tb.cn/F3.ZRTY0o

Cassandra 技術社區微信公衆號:

本文分享自微信公衆號 - ApacheHudi(ApacheHudi)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索