i,大家好,我是大D。今天繼續瞭解下 HBase 是如何寫入數據的,然後再講解一下一個比較經典的面試題。 ...
hi,大家好,我是大D。今天繼續瞭解下 HBase 是如何寫入數據的,然後再講解一下一個比較經典的面試題。
Region Server 定址
- HBase Client 訪問 ZooKeeper;
- 獲取寫入 Region 所在的位置,即獲取 hbase:meta 表位於哪個 Region Server;
- 訪問對應的 Region Server;
- 獲取 hbase:meta 表,並查詢出目標數據位於哪個 Region Server 中的哪個 Region 中。並將該 table 的 Region 信息以及 meta 表的位置信息緩存在客戶端的 meta cache,方便下次訪問;
寫 Hlog
- HBase Client 向 Region Server 發送寫 Hlog 請求;
- Region Server 會通過順序寫入磁碟的方式,將 Hlog 存儲在 HDFS 上;
寫 MemStore 並返回結果
- HBase Client 向 Region Server 發送寫 MemStore 請求;
- 只有當寫 Hlog 和寫 MemStore 的請求都成功完成之後,並將反饋給 HBase Client,這時對於整個 HBase Client 寫入流程已經完成。
MemStore 刷盤
HBase 會根據 MemStore 配置的刷盤策略定時將數據刷新到 StoreFile 中,完成數據持久化存儲。
為什麼要把 WAL 載入到 MemStore中,再刷寫成 HFile 呢?
WAL (Write-Ahead-Log) 預寫日誌是 HBase 的 RegionServer 在處理數據插入和刪除過程中用來記錄操作內容的一種日誌。每次Put、Delete等一條記錄時,首先將其數據寫入到 RegionServer 對應的 HLog 文件中去。
而WAL是保存在HDFS上的持久化文件,數據到達 Region 時先寫入 WAL,然後被載入到 MemStore 中。這樣就算Region宕機了,操作沒來得及執行持久化,也可以再重啟的時候從 WAL 載入操作並執行。
那麼,我們從寫入流程中可以看出,數據進入 HFile 之前就已經被持久化到 WAL了,而 WAL 就是在 HDFS 上的,MemStore 是在記憶體中的,增加 MemStore 並不能提高寫入性能,為什麼還要從 WAL 載入到 MemStore中,再刷寫成 HFile 呢?
- 數據需要順序寫入,但 HDFS 是不支持對數據進行修改的;
- WAL 的持久化為了保證數據的安全性,是無序的;
- Memstore在記憶體中維持數據按照row key順序排列,從而順序寫入磁碟;
所以 MemStore 的意義在於維持數據按照RowKey的字典序排列,而不是做一個緩存提高寫入效率。
另外,非常歡迎大家加我VX: Abox_0226 ,備註「進群」,有關大數據技術的問題在群里一起探討。