首先,需要明確的是,HBase寫入速度比讀取速度要快,根本原因LSM存儲(chǔ)引擎。
LSM樹全稱是基于日志結(jié)構(gòu)的合并樹(Log-Structured Merge-Tree)。No-SQL數(shù)據(jù)庫一般采用LSM樹作為數(shù)據(jù)結(jié)構(gòu),HBase也不例外。
一、RDBMS采用B+樹作為索引的數(shù)據(jù)結(jié)構(gòu)
眾所周知,RDBMS一般采用B+樹作為索引的數(shù)據(jù)結(jié)構(gòu),如圖所示。RDBMS中的B+樹一般是3層n路的平衡樹。B+樹的節(jié)點(diǎn)對(duì)應(yīng)于磁盤數(shù)據(jù)塊。因此對(duì)于RDBMS,數(shù)據(jù)更新操作需要5次磁盤操作(從B+樹3次找到記錄所在數(shù)據(jù)塊,再加上一次讀和一次寫)。
在RDBMS中,數(shù)據(jù)隨機(jī)無序?qū)懺诖疟P塊中,如果沒有B+樹,讀性能會(huì)很低。B+樹對(duì)于數(shù)據(jù)讀操作能很好地提高性能,但對(duì)于數(shù)據(jù)寫,效率不高。對(duì)于大型分布式數(shù)據(jù)系統(tǒng),B+樹還無法與LSM樹相抗衡。

二、HBase中的LSM樹
LSM樹可以看成n層合并樹。LSM樹本質(zhì)上就是在讀寫之間取得平衡,和B+樹相比,它犧牲了部分讀性能,用來大幅提高寫性能。
在HBase中,它把隨機(jī)寫轉(zhuǎn)換成對(duì)MemStore和HFile的連續(xù)寫。下圖展示了LSM樹數(shù)據(jù)寫的過程。

數(shù)據(jù)寫(插入,更新):數(shù)據(jù)首先順序?qū)懭際Log (WAL), 然后寫到MemStore。在MemStore中,數(shù)據(jù)是一個(gè)2層B+樹(圖中的C0樹)。MemStore滿了之后,數(shù)據(jù)會(huì)被刷到StoreFile (HFile)。在StoreFile中,數(shù)據(jù)是3層B+樹(圖中的C1樹),并針對(duì)順序磁盤操作進(jìn)行優(yōu)化。
數(shù)據(jù)讀:首先搜索MemStore,如果不在MemStore中,則到StoreFile中尋找。
數(shù)據(jù)刪除:不會(huì)去刪除磁盤上的數(shù)據(jù),而是為數(shù)據(jù)添加一個(gè)刪除標(biāo)記。在隨后的major compaction中,被刪除的數(shù)據(jù)和刪除標(biāo)記才會(huì)真的被刪除。
LSM數(shù)據(jù)更新只在內(nèi)存中操作,沒有磁盤訪問,因此比B+樹要快。對(duì)于數(shù)據(jù)讀來說,如果讀取的是最近訪問過的數(shù)據(jù),LSM樹能減少磁盤訪問,提高性能。