讀和寫是Hbase的兩種常見的基本操做,這兩種操做都會涉及到Hfile和Meta表,咱們依次看看。緩存
Hfile
HFile是Hbase在HDFS中存儲數據的格式,它有以下特性:服務器
- 主標識是一個行健
- key按照有序的方式進行存儲
- HFile僅僅分配給一個Region
- 行存儲在Hfile上面,經過排好序的KeyValue存儲在磁盤上
- 當MemStore超過它的限制的時候,會新產生一個HFile
- 在搜索數據的時候,不須要加載整個Hfile,可使用Hfile的多層索引
- HDFS複製WAL和Hfile塊,而且這是自動的
- 在每一個Hfile中,最高的序列號被存儲爲meta Field
在讀數據的時候,Hbase須要知道要訪問那個Region Server,所以在讀數據的時候須要經過Meta表。3d
- Meta表也是一張Hbase的表,可是內部是一系列Region的信息
- 它的結構以下:
- Key:Region起始的key,Region Id
- Value: RegionServer信息
讀寫流程
- 客戶端首先會根據配置文件中zookeeper地址鏈接zookeeper,並讀取/
/meta-region-server節點信息,該節點信息存儲HBase元數據(hbase:meta)表所在的RegionServer地址以及訪問端口等信息。用戶能夠經過zookeeper命令(get /
/meta-region-server)查看該節點信息。
- 根據hbase:meta所在RegionServer的訪問信息,客戶端會將該元數據表加載到本地並進行緩存。而後在表中肯定待檢索rowkey所在的RegionServer信息。
- 根據數據所在RegionServer的訪問信息,客戶端會向該RegionServer發送真正的數據讀取請求。服務器端接收到該請求以後須要進行復雜的處理,具體的處理流程將會是這個專題的重點。
scanner體系
RegionServer接收到客戶端的get/scan請求以後,構建scanner體系(實際上就是作一些scan前的準備工做),在此體系基礎上一行一行檢索。code
scanner體系的核心在於三層scanner:RegionScanner、StoreScanner以及StoreFileScanner。三者是層級的關係,以下:
- 一個RegionScanner由多個StoreScanner構成,一張表由多個列族組成,就有多少個StoreScanner負責該列族的數據掃描。
- 一個StoreScanner又是由多個StoreFileScanner組成。每一個Store的數據由內存中的MemStore和磁盤上的StoreFile文件組成,相對應的,StoreScanner對象會僱傭一個MemStoreScanner和N個StoreFileScanner來進行實際的數據讀取,每一個StoreFile文件對應一個StoreFileScanner,注意:StoreFileScanner和MemstoreScanner是整個scan的最終執行者。
HBase中KeyValue是什麼樣的結構?
HBase中KeyValue並非簡單的KV數據對,而是一個具備複雜元素的結構體,其中Key由RowKey,ColumnFamily,Qualifier ,TimeStamp,KeyType等多部分組成,Value是一個簡單的二進制數據。Key中元素KeyType表示該KeyValue的類型,取值分別爲Put/Delete/Delete Column/Delete Family等。KeyValue能夠表示爲以下圖所示:
server
參考:http://hbasefly.com/2016/12/21/hbase-getorscan/對象