Hbase物理存储
?
1、整體結(jié)構(gòu)
Table中的所有行都按照row key的字典序排列。
Table 在行的方向上分割為多個(gè)Hregion。
region按大小分割的(默認(rèn)10G),每個(gè)表一開始只有一個(gè)region,隨著數(shù)據(jù)不斷插入表,region不斷增大,當(dāng)增大到一個(gè)閥值的時(shí)候,Hregion就會(huì)等分會(huì)兩個(gè)新的Hregion。當(dāng)table中的行不斷增多,就會(huì)有越來越多的Hregion。
Hregion是Hbase中分布式存儲(chǔ)和負(fù)載均衡的最小單元。最小單元就表示不同的Hregion可以分布在不同的HRegion server上。但一個(gè)Hregion是不會(huì)拆分到多個(gè)regionserver上的。
HRegion雖然是負(fù)載均衡的最小單元,但并不是物理存儲(chǔ)的最小單元。?
事實(shí)上,HRegion由一個(gè)或者多個(gè)Store組成,每個(gè)store保存一個(gè)column family。?
每個(gè)Strore又由一個(gè)memStore和0至多個(gè)StoreFile組成。如上圖
2、STORE FILE & HFILE結(jié)構(gòu)
StoreFile以HFile格式保存在HDFS上。
附:HFile的格式為:?
首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其他數(shù) 據(jù)塊的起始點(diǎn)。
File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。
Data Index和Meta Index塊記錄了每個(gè)Data塊和Meta塊的起始點(diǎn)。
Data Block是HBase I/O的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機(jī)制。每個(gè)Data塊的大小可以在創(chuàng)建一個(gè)Table的時(shí)候通過參數(shù)指定,大號的Block有利于順序Scan,小號Block利于隨機(jī)查詢。 每個(gè)Data塊除了開頭的Magic以外就是一個(gè)個(gè)KeyValue對拼接而成, Magic內(nèi)容就是一些隨機(jī)數(shù)字,目的是防止數(shù)據(jù)損壞。
HFile里面的每個(gè)KeyValue對就是一個(gè)簡單的byte數(shù)組。但是這個(gè)byte數(shù)組里面包含了很多項(xiàng),并且有固定的結(jié)構(gòu)。我們來看看里面的具體結(jié)構(gòu):
開始是兩個(gè)固定長度的數(shù)值,分別表示Key的長度和Value的長度。緊接著是Key,開始是固定長度的數(shù)值,表示RowKey的長度,緊接著是 RowKey,然后是固定長度的數(shù)值,表示Family的長度,然后是Family,接著是Qualifier,然后是兩個(gè)固定長度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)了。
HFile分為六個(gè)部分:
- Data Block 段–保存表中的數(shù)據(jù),這部分可以被壓縮
- Meta Block 段 (可選的)–保存用戶自定義的kv對,可以被壓縮。
- File Info 段–Hfile的元信息,不被壓縮,用戶也可以在這一部分添加自己的元信息。
- Data Block Index 段–Data Block的索引。每條索引的key是被索引的block的第一條記錄的key。
- Meta Block Index段 (可選的)–Meta Block的索引。
- Trailer–這一段是定長的。保存了每一段的偏移量,讀取一個(gè)HFile時(shí),會(huì)首先 讀取Trailer,Trailer保存了每個(gè)段的起始位置(段的Magic Number用來做安全check),然后,DataBlock Index會(huì)被讀取到內(nèi)存中,這樣,當(dāng)檢索某個(gè)key時(shí),不需要掃描整個(gè)HFile,而只需從內(nèi)存中找到key所在的block,通過一次磁盤io將整個(gè) block讀取到內(nèi)存中,再找到需要的key。DataBlock Index采用LRU機(jī)制淘汰。
HFile的Data Block,Meta Block通常采用壓縮方式存儲(chǔ),壓縮之后可以大大減少網(wǎng)絡(luò)IO和磁盤IO,隨之而來的開銷當(dāng)然是需要花費(fèi)cpu進(jìn)行壓縮和解壓縮。?
目標(biāo)Hfile的壓縮支持兩種方式:Gzip,Lzo。
3、Memstore與storefile
一個(gè)region由多個(gè)store組成,每個(gè)store包含一個(gè)列族的所有數(shù)據(jù)。?
Store包括位于內(nèi)存的memstore和位于硬盤的storefile。?
寫操作先寫入memstore,當(dāng)memstore中的數(shù)據(jù)量達(dá)到某個(gè)閾值,Hregionserver啟動(dòng)flashcache進(jìn)程寫入storefile,每次寫入形成單獨(dú)一個(gè)storefile。?
當(dāng)storefile大小超過一定閾值后,會(huì)把當(dāng)前的region分割成兩個(gè),并由Hmaster分配給相應(yīng)的region服務(wù)器,實(shí)現(xiàn)負(fù)載均衡。?
客戶端檢索數(shù)據(jù)時(shí),先在memstore找,找不到再找storefile。
4、HLog(WAL log)
WAL 意為Write ahead log(http://en.wikipedia.org/wiki/Write-ahead_logging),該機(jī)制用于數(shù)據(jù)的容錯(cuò)和恢復(fù),Hlog記錄數(shù)據(jù)的所有變更,一旦數(shù)據(jù)修改,就可以從log中進(jìn)行恢復(fù)。
每個(gè)HRegionServer中都有一個(gè)HLog對象,HLog是一個(gè)實(shí)現(xiàn)Write Ahead Log的類,在每次用戶操作寫入MemStore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件中(HLog文件格式見后續(xù)),HLog文件定期會(huì)滾動(dòng)出新的,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。當(dāng)HRegionServer意外終止后,HMaster會(huì)通過Zookeeper感知到,HMaster首先會(huì)處理遺留的 HLog文件,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)region的目錄下,然后再將失效的region重新分配,領(lǐng)取到這些region的HRegionServer在Load Region的過程中,會(huì)發(fā)現(xiàn)有歷史HLog需要處理,因此會(huì)Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles,完成數(shù)據(jù)恢復(fù)。
HLog文件就是一個(gè)普通的Hadoop Sequence File:
-
HLog Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和region名字外,同時(shí)還包括 sequence number和timestamp,timestamp是”寫入時(shí)間”,sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中sequence number。
-
HLog Sequece File的Value是HBase的KeyValue對象,即對應(yīng)HFile中的KeyValue,可參見上文描述。
總結(jié)
- 上一篇: hbase过滤器查询
- 下一篇: Hbase读写过程