regionserver服務於許多區域。區域伺服器中的所有區域共享相同活動的wal檔案。wal檔案中的每個編輯都包含有關它屬於哪個區域的資訊。當開啟區域時,需要重播屬於該區域的wal檔案中的編輯。因此,wal檔案中的編輯必須按區域分組,以便可以重播特定的集合以重新生成特定區域中的資料。按區域對wal編輯進行分組的過程稱為日誌拆分。如果區域伺服器出現故障,它是恢復資料的關鍵過程。
在群集啟動時由hmaster完成日誌拆分,或者在區域伺服器關閉時由servershutdownhandler完成日誌拆分。為保證一致性,受影響的區域在資料恢復之前不可用。所有wal編輯都需要在給定區域再次可用之前恢復並重播。因此,受到日誌拆分影響的區域在該過程完成之前不可用。
過程:日誌分割,分步執行
新目錄按以下模式命名:
1、/hbase/wals/,,目錄被重新命名。重新命名該目錄非常重要,因為即使hmaster認為它已關閉,regionserver仍可能啟動並接受請求。如果regionserver沒有立即響應,也沒有檢測到它的zookeeper會話,hmaster可能會將其解釋為regionserver失敗。重新命名日誌目錄可確保現有的有效wal檔案仍然由活動但繁忙的regionserver使用,而不會意外寫入。新目錄根據以下模式命名:
/hbase/wals/,,-splitting
這種重新命名的目錄的例子可能如下所示:
/hbase/wals/srv.example.com,60020,1254173957298-splitting
2、每個日誌檔案都被拆分,每次乙個。日誌拆分器一次讀取乙個編輯項的日誌檔案,並將每個編輯條目放入對應於編輯區域的緩衝區中。同時,拆分器啟動多個編寫器執行緒。編寫器執行緒選取相應的緩衝區,並將緩衝區中的編輯項寫入臨時恢復的編輯檔案。臨時編輯檔案使用以下命名模式儲存到磁碟:
/hbase/
該檔案用於儲存此區域的wal日誌中的所有編輯。日誌拆分完成後,.temp檔案將被重新命名為寫入檔案的第乙個日誌的序列id。要確定是否所有編輯都已寫入,將序列id與寫入hfile的上次編輯的序列進行比較。如果最後編輯的序列大於或等於檔名中包含的序列id,則很明顯,編輯檔案中的所有寫入操作都已完成。
3、日誌拆分完成後,每個受影響的區域將分配給regionserver。開啟該區域時,會檢查recoverededed資料夾以找到恢復的編輯檔案。如果存在任何這樣的檔案,則通過讀取編輯並將其儲存到memstore來重播它們。在重放所有編輯檔案後,memstore的內容被寫入磁碟(hfile),編輯檔案被刪除。
處理日誌分割期間的錯誤
如果您將該hbase.hlog.split.skip.errors選項設定為true,則錯誤處理如下:
如果該hbase.hlog.split.skip.errors選項設定為false預設值,則將傳播該異常,並將該拆分記錄為失敗。
拆分崩潰的regionserver的wal時如何處理eofexception
如果在拆分日誌時發生eofexception,即使hbase.hlog.split.skip.errors設定為false,拆分也會繼續。在讀取要拆分的檔案集合中的最後乙個日誌時,可能會出現eofexception,因為regionserver可能在崩潰時寫入記錄的過程中。
在日誌分割期間的效能改進
wal日誌拆分和恢復可能需要大量資源並需要很長時間,具體取決於崩潰中涉及的regionserver的數量和區域的大小。啟用或禁用分布式日誌分割是為了提高日誌分割期間的效能。
啟用或禁用分布式日誌拆分
分布式日誌處理自hbase 0.92開始預設啟用。該設定由hbase.master.distributed.log.splitting屬性控制,可以設定為true或false,但預設為true。
分布式日誌拆分,分步執行
配置分布式日誌拆分後,hmaster控制程序。hmaster在日誌拆分過程中註冊每個regionserver,實際拆分日誌的工作由regionservers完成。分布式日誌拆分中逐步描述的日誌拆分的一般過程在這裡仍然適用。
1、如果啟用分布式日誌處理,則hmaster會在集群啟動時建立拆分日誌管理器例項。
拆分日誌管理器管理所有需要掃瞄和拆分的日誌檔案。
拆分日誌管理器將所有日誌作為任務放入zookeeper splitwal節點( hbase/splitwal)中。
您可以通過發出以下zkcli命令來檢視splitwal的內容。顯示示例輸出。
ls /hbase/splitwal
[hdfs%3a%2f%2fhost2.sample.com%3a56020%2fhbase%2fwals%2fhost8.sample.com%2c57020%2c1340474893275-
splitting%2fhost8.sample.com%253a57020.1340474893900,
hdfs%3a%2f%2fhost2.sample.com%3a56020%2fhbase%2fwals%2fhost3.sample.com%2c57020%2c1340474893299-
splitting%2fhost3.sample.com%253a57020.1340474893931,
hdfs%3a%2f%2fhost2.sample.com%3a56020%2fhbase%2fwals%2fhost4.sample.com%2c57020%2c1340474893287-
splitting%2fhost4.sample.com%253a57020.1340474893946]
輸出包含一些非ascii字元。解碼後,它看起來更簡單:
[hdfs:
/host8.sample.com,57020,1340474893275-splitting
/host8.sample.com%3a57020.1340474893900,
hdfs:
/host3.sample.com,57020,1340474893299-splitting
/host3.sample.com%3a57020.1340474893931,
hdfs:
/host4.sample.com,57020,1340474893287-splitting
/host4.sample.com%3a57020.1340474893946]
該列表表示要掃瞄和拆分的wal檔名,這是日誌拆分任務的列表。
2、拆分日誌管理器監視日誌拆分任務和工作人員。拆分日誌管理器負責以下正在進行的任務:
get /hbase/splitwal/hdfs%3a%2f%2fhost2.sample.com%3a56020%2fhbase%2fwals%2fhost6.sample.com%2c57020%2c1340474893287-
splitting%2fhost6.sample.com%253a57020.1340474893945
unassigned host2.sample.com:57000
czxid = 0×7115
ctime = sat jun 23 11:13:40 pdt 2012 ...
根據資料更改的任務的狀態,拆分日誌管理器將執行以下操作之一:
3、每個regionserver的拆分日誌工作器執行日誌拆分任務。每個regionserver執行乙個稱為拆分日誌工作器的守護程序執行緒,它負責拆分日誌。守護程式執行緒在regionserver啟動時啟動,並註冊自己以觀察hbase znode。如果任何splitwal znode子項發生更改,它會通知睡眠工作器執行緒喚醒並獲取更多工。如果工作人員當前任務的節點資料發生更改,則工作人員將檢查該任務是否已由其他工作人員執行。如果是這樣,工作執行緒會停止當前任務的工作。工作人員不斷監視splitwal znode。出現新任務時,拆分日誌工作人員將檢索任務路徑並檢查每個任務路徑,直到找到未宣告的任務,並嘗試宣告該任務。如果宣告成功,它將嘗試執行該任務並state根據拆分結果更新任務的屬性。此時,拆分日誌工作者會掃瞄另乙個無人認領的任務。拆分日誌工作者如何接近任務
4、拆分日誌管理器監視未完成的任務。拆分日誌管理器在所有任務成功完成時返回。如果所有任務都完成並出現一些故障,則拆分日誌管理器將引發異常,以便日誌拆分可以重試。由於非同步實現,在極少數情況下,拆分日誌管理器會丟失一些已完成任務的跟蹤。因此,它定期檢查其任務圖或zookeeper中剩餘的未完成任務。如果沒有找到,它會丟擲乙個異常,以便日誌拆分可以馬上重試,而不是掛在那裡等待不會發生的事情。
hbase 預設目錄 HBase的目錄分析
hbase tmp 臨時目錄,當對表做建立和刪除操作時,會將表move到該目錄下,然後進行操作。hbase wals regionserver在處理資料插入和刪除的過程中記錄操作內容的一種日誌,在0.94叫.logs hbase data 核心目錄,儲存hbase表的資料 預設情況下該目錄下有兩個目...
hbase目錄介紹
hbase tmp 臨時目錄,當對表做建立和刪除操作時,會將表move到該目錄下,然後進行操作。hbase wals regionserver在處理資料插入和刪除的過程中記錄操作內容的一種日誌,在0.94叫.logs hbase data 預設情況下該目錄下有兩個目錄 hbase data defa...
Hbase修改預設儲存版本數
hbase預設情況下,只儲存3個版本的歷史資料。但在實際應用中,可能會有多於3個版本要儲存,那麼如何在表已建好的情況下,修改預設儲存版本數尼,下面為工作記錄 1.表下線 disable hbase main 004 0 disable xls 0 row s in 2.1050 seconds 2....