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的定位
- 客戶端通過ZK的
/hbase/meta-region-server
節點查詢到哪臺RegionServer上有hbase:meta
表。 - 客戶啊短連線含有
hbase:meta
表的RegionServer,hbase:meta表儲存了所有Region的行鍵範圍資訊,通過這個表就可以查詢出需要存取的rowkey屬於哪個Region的範圍裡面,以及這個Region又屬於RegionServer。 - 客戶端直連一臺擁有要存取rowkey的RegionServer,並對其直接操作。
- 客戶端把
hbase:meta
的資訊直接快取起來。
一個Region包含多個Store:一個Store對應一個列族的資料,如果一個表有兩個列族,那麼在一個Region中就有兩個Store,每個Store內部有MemStore和HFile兩部分。