您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關HBase文件索引有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
HBase總體結構圖
部分術語簡介
HMaster | 負責管理HRegionServer的接入,負責Region的管理分配,負責管理Table的創建于刪除修改等操作。 |
HRegion | 每個Table可以分裂成多個Region,每個Region為Table中的一個行區間。例如RowKey為0-100的Table,可以分裂成0-50以及51-100這兩個Region。 |
HRegionServer | 每個HRegionServer管理著多個Region,負責對Region的讀寫操作等 |
HLog | 每個HRegionServer都有一個HLog用來記錄所有操作,主要用于數據損壞時修復數據。物理上是Hadoop的Sequence File |
Store | 每個HRegion下管理著多個Store,每個Store對應Table中的一個Family進行數據管理 |
StoreFile | Family的持久化數據類 |
MemStore | 每個Store中都有一個MemStore,用來緩存對Family的操作,當MemStore緩存到一點大小之后,將會轉換成StoreFile Flush到HDFS中 |
HFile | StoreFile只是HFile的輕量級封裝,HDFS中保存的Table數據文件都是HFile格式 |
索引的總體結構
在HBase中,從整個大框架上來看,索引的分布分為以下幾層。
A、在Zookeeper中,根據HMaster的啟動,保存著分配了-ROOT- Table的RegionServer的地址。
B、在-ROOT- Table中,保存著.META Table split成多個region后所分布在的RegionServers的信息。
C、在.META中,保存著各個Table的regions所分布的RegionServers地址。
D、-ROOT-只存在一個Region,而.META是可以split成多個的。
-ROOT- 與 META的表結構是一樣的,如下
Rowkey | info | ||
Regioninfo | server | serverstartcode | |
TableName StartKey TimeStamp | Startkey Endkey family list | address | 加載當前分片的啟動時間 |
-ROOT-示例:
假設.META分裂成了兩個Region,分布在了兩個RegionServer上
Rowkey | Info | ||
Regioninfo | Server | serverstarcode | |
.META Table1 pk0 12345278 | RegionServer1 | ||
.META Table1 pk1000 123451278 | RegionServer2 | ||
.META Table2 pk0 123431278 | RegionServer1 | ||
.META Table2 pk1000 123457278 | RegionServer2 |
.META的示例:
Rowkey | Info | ||
Regioninfo | Server | serverstarcode | |
Table1 pk0 12345278 | RegionServer1 | ||
Table1 pk1000 123451278 | RegionServer2 | ||
Table1 pk2000 12345878 | RegionServer3 | ||
…… | …… | …… | …… |
Table2 pk0 12345278 | RegionServer1 | ||
Table2 pk1000 12345478 | RegionServer2 | ||
Table2 pk2000 12345778 | RegionServer3 |
RegionServer的定位過程
當Client要對一個Table中的數據進行put、get、delete操作時,提供了TableName以及RowKey時,Client從Zookeeper中獲取到-ROOT-的RegionServer信息,然后從-ROOT-中根據RowKey獲取到.META的ReginoServer,從而再定位到RowKey所在的RegionServer中。由于Client在交互過程中會緩存-ROOT-、.META、Region等位置信息,在最優情況下只需要查詢一次位置,在最壞情況下是需要6次[ 需要從Table Region遞歸回去查詢 ]。
HFile的數據存儲結構:
如上圖,HFile的文件長度為變長,其中的File Info以及Trailer是定長,Trailer中有指向File Info\Data Index\Meta Index的起始點。Index數據塊記錄著Data\Meta塊的起始點。在Data數據塊中,Magic是用來辨別數據是否損壞的,每個Data塊中保存著多個KeyValue信息。
上圖為KeyValue的數據結構
上圖也為HFile的數據結構
整個的region文件路徑就是如下形式:
/<hbase-root-dir>/<tablename>/<encoded-regionname>/<column-family>/<filename>
每個column-family下的一個個HFile數據文件,文件的名字是基于Java內建的隨機數生成器產生的任意數字。代碼會保證不會產生碰撞,比如當發現新生成的數字已經存在時,它會繼續尋找一個未被使用的數字。
Region的操作
當定位到RowKey所在的RegionServer之后,就能根據RegionName來獲取到相對應的Region,RegionName來自.META中保存的RowKey。
Get:
1、HRegion.get接口會先對Family做檢測,保證Get中的Family與Table中的保持一致。
2、根據Family的信息,找出對應的Store,并獲取到Store中的StoreScanner實例,并將其添加到一個scanners隊列中。
3、在StoreScanner中,又有MemstoreScanner和HFileScanner兩個實例,分別用來遍歷MemStore與HFile中的keyValue值的。
4、因為存在多個HFile,因此會對HFileScanner會做一次過濾選擇,通過HFile的DataIndex將position指向StarRow,DataIndex中是保存有當前DataBlock的firstKey信息的,如果KeyValue不在當前HFile中,將關閉HFileScanner的查找。
5、需要注意的是,在RegionServer啟動之后,HFile的DataIndex是保存在內存中的。
6、當StoreScanner查詢相應的keyValue時,先利用MemstoreScanner從MemStore中查找,如果沒有相應數據,再利用HFileScanner從HFile的DataBlock中遍歷,DataIndex能快速定位Block所在的位置。
7、由于HFile已經被持久化到HDFS中,對HFile的每次IO讀取,都只是讀取一個Data數據塊的大小,Data的位置可以根據HFile的DataIndex信息來查詢。
8、如果有配置使用Bloom Filters,將能快速確認一個RowKey或者value是否在一個HFile中。
關于“HBase文件索引有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。