resultset rs =pst.executequery();发生异常_07795.14.4HMaster无法成为Active异常分析
作者:朱超杰
故障描述1.1發生背景
很久很久以前,有一天,我在HBase中新建了一張表 “XXX: XXX _EXCEPTION_LIST_INFO”,同時HBase在處理大量更新操作。然后在DROP掉表XXX: XXX_EXCEPTION_LIST_INFO時,HBase Master就宕機。
之后通過CM重新啟動后HBase服務,服務重啟后發生如下兩個錯誤,導致HBase集群無法正常恢復:(1)HMaster節點自動Active失敗;(2)大量Region出現offline和RIT。
1.2現象描述
HA HMaster節點啟動了,過一段時間Active HBase Master節點自動失敗(大概3~5分鐘)。因為集群采用了HA高可用,因此Standby HBase Master節點自動切換為Active。再過差不多相同時間,該節點也自動失敗。
查看Master節點的日志報錯如下
Failed to become active master java.io.IOException: Timedout 300000ms waiting for namespace table to be assignedMaster Web UI上顯示處于RIT的Region
Master狀態頁告警信息:
Found regions staying in transition state for a duration longer than the configured threshold in HBase.故障分析處理1.Master的日志報錯:Timeout 300000ms waiting for namespace table to be assigned.表示namespace表未分配,并且超過設置的時間閾值。在HBase的設計中,Master啟動時首先分配meta表,然后再分配其它表。系統表hbase:namespace和其它用戶表分配時同等對待,并沒有先分配系統表再分配用戶表,如果一個集群region非常多,默認300000ms(5分鐘)還分配不到namespace表,此時需要修改hbase.master.namespace.init.timeout超時時間。
2.根據此時情況,通過CM在“hbase-site.xml的HBase服務高級配置代碼段(安全閥)”中增加以下配置:
<property><name>hbase.master.namespace.init.timeoutname>
<value>86400000value>
property>
<property>
<name>hbase.master.initializationmonitor.timeoutname>
<value>86400000value>
property>
即增加namespace表分配超時時間為1天。
修改完成之后重啟HBase服務,這里選擇滾動重啟HBase時RegionServer無法重啟,所以選擇完成重啟HBase服務。
3.重啟完成后,Master依然告警:Found regions staying in transition state for a duration longer than the configured threshold in HBase.,但服務并未宕掉,Master告警提示的原因是在HBase Master啟動時,檢測到有Region長時間處于RIT狀態(超過閾值)。
查看Master日志如下
大量Region處于PENDING_OPEN狀態,Master檢測到RIT,
查看Zookeeper中的/hbase/region-in-transition,也可以看到大量的Region。
說明:每次HBase Master對Region的一個OPEN或一個CLOSE操作都會向Master 的RIT列表中插入一條記錄,因為Master對Region的操作要保持原子性。Region的 OPEN和 CLOSE是通過HBase Master和 RegionServer 協助來完成的。為了滿足這些操作的協調、回滾、一致性,HBase Master采用了 RIT 機制并結合Zookeeper 中znode狀態來保證操作的安全和一致性。
Region有以下幾種狀態:
OFFLINE:region is in an offline state
PENDING_OPEN:sent rpc to server to open but has not begun
OPENING:server has begun to open but not yet done
OPEN:server opened region and updated meta
PENDING_CLOSE:sent rpc to server to close but has not begun
CLOSING:server has begun to close but not yet done
CLOSED:server closed region and updated meta
SPLITTING:server started split of a region
SPLIT:server completed split of a region
在注冊為active的Master Web UI上查看已上線的Region數如下:
4.經確認HBase未使用replication后,選擇重建Znode的方式進行測試:
?a.停止HBase服務
?b.使用hbase zkcli命令進入ZK客戶端
?c.執行rmr /hbase清除/hbase
d.重啟HBase服務,此時/hbase會重新生成
5.但是重啟完之后問題依然存在,再次查看Master日志發現如下信息:
6.查看RegionServer的日志,可以看到頻繁出現以下錯誤:
由上可以看出索引表的Region is not online,查看RegionServer Web UI發現RPC線程一直處于Initializing Region的Replaying edits階段,并且在等待一個小時時間后依然未完成。因此分析原因為Phoenix索引表的Region不能online,導致數據表的Region構建進程卡住,但是這些構建進程占用了openregion線程(默認3個),導致索引表不能正常openregion,產生死鎖。
因此需要調整hbase.regionserver.executor.openregion.threads參數以增加openregion線程數。
7.通過CM在“hbase-site.xml的HBase服務高級配置代碼段(安全閥)”中增加以下配置:
<property><name>hbase.regionserver.executor.openregion.threadsname>
<value>200value>
property>
即增加Region分配線程數至200個,然后再次重啟HBase服務
重啟HBase服務, HBase Master仍有告警信息,但在Active Master Web UI上可以看到上線的Region數量在增加,同時RIT中的Region數量在減少。稍等片刻后HBase服務恢復正常。
經測試HBase可以正常提供服務,數據無丟失。
處理結論1.HBase Master在啟動時會首先分配meta表的Region,然后再分配其它表。namespace表和user表分配時同等對待,并沒有先分配系統表再分配用戶表,如果一個集群Region非常多,默認300000ms(5分鐘)有可能還分配不到namespace表,此時拋出異常:Failed to become active master java.io.IOException: Timedout 300000ms waiting for namespace table to be assigned。此時需要調整參數hbase.master.namespace.init.timeout增加超時時間。
2.分布式死鎖發生在使用Phoenix(4.14.1)構建二級索引,并且數據表、二級索引表的Region數量適中的集群中。當RegionServer打開Phoenix數據表的一個Region時,它將為該Region執行WAL重播,并重新構建二級索引表,而數據表的Region分配依賴于二級索引表。默認情況下每個RS上只有一個線程池,包含三個openregion線程。而二級索引表和數據表共用同一個線程池。因此,當Phoenix數據表的Region的這些重建進程占用了openregion線程時,二級索引表就只能進入隊列等候,其Region就不能online。這就是死鎖發生的原因。
解決方式可以在hbase-site.xml中修改以下參數:
1)設置hbase.master.startup.retainassign為false(默認為true)
2)增加hbase.regionserver.executor.openregion.threads 的值(默認為3),然后重啟集群解決。
如果還是出現同樣問題,可以調優以下分配管理器參數,以匹配Region的數量,從而加快分配速度:
hbase.assignment.threads.max:線程池大小,默認值30
hbase.master.namespace.init.timeout:默認值300000ms
hbase.master.wait.on.regionservers.mintostart:向HMaster匯報的RegionServer的數量最小啟動值,默認值1
hbase.bulk.assignment.threshold.regions:Region數量超過閾值(默認值7),使用bulk assign
hbase.bulk.assignment.threshold.servers :Server數量超過閾值(默認值3),使用bulk assign
參考鏈接:
https://issues.apache.org/jira/browse/PHOENIX-3072
https://issues.apache.org/jira/browse/HBASE-16095
https://docs.cloudera.com/documentation/enterprise/release-notes/topics/cdh_rn_phoenix_ki.html#concept_xdx_1wq_dq總結
以上是生活随笔為你收集整理的resultset rs =pst.executequery();发生异常_07795.14.4HMaster无法成为Active异常分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python封装函数、实现将任意的对象序
- 下一篇: python模拟手写笔迹_pytorch