1. 程式人生 > 實用技巧 >HBase 表操作

HBase 表操作

Hbase 表操作

Master:負責啟動的時候分配Region到具體的RegionServer,執行各種管理操作。

RegionServer:有一個或多個Region。

Region:表的一部分資料。HBase是一個會自動分片的資料庫


一個WAL:預寫日誌,是一個環狀滾動日誌,當操作到達Region時,Hbase先將操作寫到WAL中。HBase先把資料放到基於記憶體實現的Memstore中,等資料到達一定數量時才刷到HFile中。如果期間伺服器宕機或者斷電,資料丟失,WAL就是一個保險機制。當故障恢復時候,就可以從WAL中恢復資料。

# 開啟非同步寫入WAL
Mutation.setDurability(Durability.ASYNC_WAL);

Region在滿足hbase.regionserver.optionallogflushinterval條件才會寫入,預設時間間隔是1s。

檢查間隔由hbase.regionserver.logroll.period定義,預設為1小時。

WAL檔案的最大數量通過hbase.regionserver.maxlogs定義,預設為32。

  • 當WAL檔案所在的塊快要滿了
  • WAL所佔的空間大於或等於某個閾值
hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier

WAL被創建出來之後會放在/hbase/.log

下,歸檔之後放在/hbase/.oldlogs下。

Master會定時清理.oldlogs

  • TTL程序:保證WAL檔案一直存活,達到hbase.master.logcleaner.ttl定義的超時時間為止(預設十分鐘)
  • 備份機制(replaction):如果開啟了HBase的備份機制,那麼HBase要保證備份叢集已經完全不需要這個WAL檔案了,才會刪除。

Store內部結構

  • MemStore:每個Store中有一個MemStore例項。資料寫入WAL之後就會被放入MemStore。MemStore是記憶體的儲存物件,只有當MemStore滿了才會將資料寫入到HFile中。
  • HFile:在Store中有多個HFile。當MemStore滿了之後HBase就會生成一個新的HFile,然後把MemStore中的內容寫入到這個HFile中,HFile直接跟HDFS打交道,是資料的儲存實體。

HDFS上的資料只能建立,追加和刪除,對於一個數據庫來說,按順序存放資料是非常重要的,是效能的保障,所以不能按照資料到來的順序寫入硬碟。

使用記憶體先把資料整理成順序存放,然後再一起寫入硬碟。

MemStore

HBase使用了LSM樹結構儲存資料。資料現在MemStore中整理成LSM樹,在刷寫到HFile中。讀取的時候有個專門的快取叫BlockCache,如果開啟BlockCache,先讀取BlockCache,讀取不到才讀HFile+MemStore。如果資料新增後又刪除了,則刷寫的時候就直接不把這個資料寫入到HDFS中。

HFile

在HBase中一個塊預設大小為64KB,在列族上的BLOCKSIZE屬性定義。

  • Data:資料塊,每個HFile存在多個Data塊,
  • Meta:元資料塊,可選的,只有在檔案關閉時才會寫入,儲存了HFile檔案的元資料資訊。
  • FileInfo:檔案資訊,必要儲存資訊,只有在檔案關閉的時候寫入,儲存的是該檔案的資訊。
  • DataIndex:儲存Data塊索引資訊的塊檔案。也就是Data塊的偏移值,
  • MetaIndex:Meta塊索引資訊的塊檔案。
  • Trailer:必須,儲存了FileInfo,DataIndex,MetaIndex塊的偏移值。

Data塊

第一位儲存的是塊的型別,後面儲存的是多個KeyValue鍵值對,也就是單元格(Cell)的實現類,Cell是一個介面,KeyValue是它的實現類。

BlockType(塊型別):Data、Meta、FILE_INFO、ROOT_INDEX...

一個KeyValue類裡面最後一個部分是儲存資料的Value,而前面的部分是儲存該跟單元格相關的元資料資訊。如果你儲存的value很小,那麼該單元格絕大部分空間都是rowkey、column family、column等元資料。

Region的定位

  1. 客戶端通過ZK的/hbase/meta-region-server節點查詢到哪臺RegionServer上有hbase:meta表。
  2. 客戶啊短連線含有hbase:meta表的RegionServer,hbase:meta表儲存了所有Region的行鍵範圍資訊,通過這個表就可以查詢出需要存取的rowkey屬於哪個Region的範圍裡面,以及這個Region又屬於RegionServer。
  3. 客戶端直連一臺擁有要存取rowkey的RegionServer,並對其直接操作。
  4. 客戶端把hbase:meta的資訊直接快取起來。

一個Region包含多個Store:一個Store對應一個列族的資料,如果一個表有兩個列族,那麼在一個Region中就有兩個Store,每個Store內部有MemStore和HFile兩部分。