1. 程式人生 > >HBase寫和讀的機制

HBase寫和讀的機制

HBase寫機制

  預設情況下,執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱HLog)和MenStore。Hbase預設方式是把寫入動作記錄在這兩個地方,以保證資料持久化。只有當這兩個地方的變化資訊都寫入並確認後,才認為寫動作完成。
  MemStore是記憶體裡的寫入緩衝區,HBase中資料在永久寫入磁碟之前在這裡累積。當Memstore填滿後,其中的資料會刷寫到硬碟,生成一個HFile。HFile是HBase使用的底層儲存格式。HFile對應於列族,一個列族可以有多個HFile,但一個HFile不能儲存多個列族的資料。在叢集的每個節點上,每個列族有一個Memstore。
  大型分散式系統中硬體故障很常見,HBase也不例外。如果MemStore還沒有刷寫,伺服器就崩潰了,記憶體中沒有寫入硬碟的資料就會丟失。應對盤發是在寫動作完成之前先寫入WAL。HBase叢集中每臺伺服器都維護一個WAL來記錄發生的變化。WAL是底層檔案系統上的一個檔案。直到WAL新記錄成功寫入後,寫動作才被認為成功完成。
  如果Hbase伺服器宕機,沒有從MemStore中刷寫到HFile的資料可以通過回訪WAL來恢復。不需要手動執行。

HBase讀機制

  如果想快速訪問資料,通用的原則是資料保持有序且儘可能儲存在記憶體裡。HBase實現了這兩個目標。HBase讀動作必須重新銜接持久化到硬碟上的HFile和記憶體中MemStore裡的資料。HBase在讀操作上使用了LRU(最近最少使用演算法)快取技術。這種快取也叫作BlockCache,和MemStore在一個JVM堆裡。BlockCache設計用來儲存從HFile裡讀入記憶體的頻繁訪問的資料,避免硬碟讀。每個列族都有自己的BlockCache。
  掌握BlockCache是優化HBase效能的一個重要部分。BlockCache中的Block是HBase從硬碟完成一次讀取的資料單位。HFile物理存放形式是一個Block的序列外加這些Block的索引。這意味著,從HBase中讀取一個Block需要先查詢一次該Block然後從硬碟獨處。Block是建立索引的最小資料單位,也是從硬碟讀取的最小資料單位。Block大小預設為64KB,如果主要用於隨機查詢,細粒度的Block更好。Block變小會導致索引變大,消耗更多記憶體。如果主要用於順序掃描,一次讀取多個Block,那個大一點的Block較好。
  從HBase中讀出一行,首先檢查MemStore,然後檢查BlockCache,最後訪問HFile。