HBase的列式存儲


為什么要選擇列式存儲

  行式存儲和列式存儲主要是在物理存儲的選擇上面,這里主要是選擇從實體的完整性角度進行存儲,還是從實體特征維度進行存儲,行式存儲就是以實體為單位進行存儲,在物理存儲上,一個實體(的特征屬性)緊挨着另外一個實體;列式存儲就是從實體特征維度進行存儲,通常是以列為物理存儲單元,這種存儲模式也決定了查詢的模式也是基於列取查詢;所以,當我們想要按照實體去查詢列式存儲的數據,一般都是需要並行查詢,所以列式存儲天生的是分布式數據庫的架構。
  在OLTP場景,更多的基於實體的維護和查詢,但是在OLAP場景,則是更多地從實體特征角度進行數據處理(統計),所以在OLAP的場景下,如果還是使用行式存儲,會導致大量的無謂的遍歷,比如想要對某個列進行所有數據的統計,因為是行式存儲,需要遍歷所有的實體的所有的屬性;如果列式存儲,則只需要按照列進行查詢即可,因為列式存儲是以列一個物理存儲單元,所以遍歷只要遍歷相應列的物理存儲文件即可。
  那么從這個角度上面來講,HBase其實是行列存儲的一個綜合體,從宏觀角度是按照列簇為單位進行存儲,從微觀角度,每一個列簇的單元是由key,value的鍵值對組成(可能是很多歌鍵值對,因為一個列簇可以包含很多列),但是values其實是行式存儲,另外HBase並不建議采用度過列簇,列簇不要超過2個,所以列式存儲的優勢並沒有完全發揮出來,但是基於HBase的技術架構,只能這樣處理,如果是純粹的列式存儲對於HBase的性能會有大影響。
  采用列式存儲還有一個好處就是可以方便的進行編碼和壓縮,因為一列中的值大概率是有大量重復的,可以對於這些重復的值進行編碼以及壓縮,節省存儲空間。

為什么HBase建議列簇不要超過2個
  1. memstore只要一個滿了就會刷,未滿的列簇會形成大量的小文件,增加查詢成本;以及會潛在增加compact的次數(文件數量、文件大小都會導致compact);
  2. 文件的Split也有類似問題,只要一個列簇文件大小達到了split,就會將這個region下所有的列簇的進行分割。

  綜合來看,上述兩點其實描述了HBase處理數據的特點,就是只要一個列簇滿足條件,那么這個region下面所有的列簇都會因此而被觸發相應操作,就是我們通常講的“躺槍”。注意,這里強調HBase的相關操作都是在Region級別完成的,分布式嘛,各自維護好自己那一塊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM