本文系轉載,若有侵權,請聯繫我:likui0913@gmail.comhtml
HBase 在讀寫的過程當中,不免會產生無效的數據以及太小的文件,好比:MemStore 在未達到指定大小便刷新數據以寫入到磁盤;或者當已經寫入 HFile 的數據被刪除後,原數據被標記了墓碑,卻仍然存在於 HFile 之中。在這些狀況之下,咱們須要清除無效的數據或者合併太小的文件來提升讀的性能。這種合併的過程也被稱爲 compacation。apache
HBase 中使用的 compacation 方式主要分爲如下兩種:服務器
HBase 會自動選擇一些較小的 HFile,並將它們重寫成更少的但更大的 HFiles 文件,這個過程被稱爲 minor_compaction。minor_compaction 經過將少許的相鄰的 HFile 合併爲單個 HFile 來達到壓縮操做,可是它不會刪除被標記爲刪除或過時的數據。網絡
Major_Compaction 將 Region 中的全部 HFile 合併並重寫成一系列由列族(Column Family)組成的 HFile 文件,並在此過程刪除已被刪除或已過時的數據。這會提升讀取性能,可是因爲 Major_compaction 會重寫全部文件,因此在此過程當中可能會發生大量的磁盤 I/O 和網絡流量,這種現象被稱爲寫入放大(write amplification)。負載均衡
最初,每個 table 都會有一個 Region。隨着數據的不斷寫入,當這個 Region 變得太大時,它就會被分裂成兩個子 Regions。兩個子 Regions 各類擁有原 Region 的一半,它們會在相同的 RegionServer 上並行打開,而後將分區信息報告給 HMaster。處於負載均衡的緣由,HMaster 可能會將新的 Region 移動到其它服務器。ide
Split 最初發生在同一個 RegionServer 上,可是出於負載均衡的緣由,HMaster 可能會將新的 Region 移動到其它服務器(移動元數據,而不是 HFile 文件)。這會致使新的 RegionServer 提供來自遠程 HDFS 節點的數據,直到 Major_compaction 時將數據文件移動到區域服務器的本地節點。性能
WAL 文件和 HFile 被保存在磁盤上並被複制,可是 MemStore 尚未被保存在磁盤上,因此當 RegionServer 發生問題後,HBase 是如何恢復 MemStore 之中的數據呢?ui
當 RegionServer 失敗時,崩潰的 Region 將不可用,直到檢查並恢復以後方可繼續使用。Zookeeper 會在失去 RegionServer 心跳時肯定節點故障,HMaster 將會被通知 RegionServer 已經失敗。htm
注:當 RegionServer 失敗時,正在查詢該節點上的數據的操做會被重試,而且不會當即丟失。blog
當 HMaster 檢測到 RegionServer 已經崩潰時,HMaster 會將已崩潰的 RegionServer 上的 Regions 從新分配給活動的 RegionServer。爲了恢復已崩潰的 RegionServer 上未刷新到磁盤的 MemStore 中的內容,HMaster 將屬於崩潰的 RegionServer 的 WAL 文件拆分紅單獨的文件,並將這些文件存儲在新的 RegionServer 的 DataNode 上。而後新的 RegionServer 根據拆分後的 WAL 文件重播 WAL,以重建丟失的 MemStore 區域。
WAL 文件包含編輯列表,一個編輯表示單個操做的 put 或者 delete。編輯按照時間順序寫入,並將附加到存儲在磁盤上的 WAL 文件的末尾。
若是數據仍在 MemStore 中而且未保存到 HFile 中時,將發生 WAL 重播。WAL 重播是經過讀取 WAL 文件,將其包含的編輯操做添加到當前的 MemStore 並進行排序來完成的。