1、Hbase為什么寫比讀快
(1)根本原因是hbase的存儲引擎用的是LSM樹,是一種面向磁盤的數據結構:
Hbase底層的存儲引擎為LSM-Tree(Log-Structured Merge-Tree)。LSM核心思想的核心就是放棄部分讀能力,換取寫入的最大化能力。LSM Tree它的核心思路其實非常簡單,就是假定內存足夠大,因此不需要每次有數據更新就必須將數據寫入到磁盤中,而可以先將最新的數據駐留在內存中,等到積累到最后多之后,再使用歸並排序的方式將內存內的數據合並追加到磁盤隊尾(因為所有待排序的樹都是有序的,可以通過合並排序的方式快速合並到一起)。另外,寫入時候將隨機寫入轉換成順序寫,數據寫入速度也很穩定。
不過讀取的時候稍微麻煩,需要合並磁盤中歷史數據和內存中最近修改操作,所以寫入性能大大提升,讀取時可能需要先看是否命中內存,否則需要訪問較多的磁盤文件。極端的說,基於LSM樹實現的HBase的寫性能比MySQL高了一個數量級,讀性能低了一個數量級。
LSM樹原理把一棵大樹拆分成N棵小樹,它首先寫入內存中,隨着小樹越來越大,內存中的小樹會flush到磁盤中,磁盤中的樹定期可以做merge操作,合並成一棵大樹,以優化讀性能。
補充:
深入理解LSM樹:https://www.pianshen.com/article/3694420068/
LSM-Tree全稱是Log Structured Merge Tree,是一種分層,有序,面向磁盤的數據結構,其核心思想是充分了利用了,磁盤批量的順序寫要遠比隨機寫性能高出很多,如下圖示:
圍繞這一原理進行設計和優化,以此讓寫性能達到最優,正如我們普通的Log的寫入方式,這種結構的寫入,全部都是以Append的模式追加,不存在刪除和修改。當然有得就有舍,這種結構雖然大大提升了數據的寫入能力,卻是以犧牲部分讀取性能為代價,故此這種結構通常適合於寫多讀少的場景
2、Hbase為什么讀取速度也快
HBase能提供實時計算服務主要原因:
(1)是由其架構和底層的數據結構決定的,即由:LSM-Tree(Log-Structured Merge-Tree) + HTable(region分區) + Cache
客戶端可以直接定位到要查數據所在的HRegion server服務器,然后直接在服務器的一個region上查找要匹配的數據,並且這些數據部分是經過cache緩存的。
前面說過HBase會將數據保存到內存中,在內存中的數據是有序的,如果內存空間滿了,會刷寫到HFile中,而在HFile中保存的內容也是有序的。當數據寫入HFile后,內存中的數據會被丟棄。HFile文件為磁盤順序讀取做了優化,按頁存儲。下圖展示了在內存中多個塊存儲並歸並到磁盤的過程,合並寫入會產生新的結果塊,最終多個塊被合並為更大塊。
(2)rowkey是排序的
(3)數據按列存儲