標籤:

為什麼說HBase是列式資料庫?

小弟才疏學淺,最近剛剛接觸到HBase,都說HBase的rowkey設計很關鍵,查詢的時候正確使用rowkey可以避免掃表量過大,提高查詢效率,而且數據存儲的時候就是按照rowkey來分片的,這樣說的話HBase更應該說成key-value資料庫才對嗎,為什麼大家都說是列資料庫呢?


最近隱隱覺得 hbase 的 "column oriented" 跟 "列式資料庫" 中的含義似乎有點區別:

  • hbase 語境中的列是數據的一個維度,可以動態增長列的數量,而列數據的磁碟組織仍與 row store 無異,相鄰的行數據有存儲局部性。
  • 而 "column store" 相對於 "row store" 在磁碟布局方面的差異更為本質,每一列都獨立相鄰存儲,便於對列內同質的數據做批量操作。

不過 hbase 裡面 column family 的概念更接近 column store 中的列。


Hbase的存儲方式就決定了列資料庫!!

1、存儲方式:在HBase中,Key-Value是最小的存儲單元。每一個Key-Value對應一個列,Value對應於一個列的列值。

2、Rowkey作用:而且HBase是根據Rowkey來進行檢索的(索引),系統通過找到某個Rowkey所在的Region,然後將查詢數據的請求路由到該Region獲取數據。

所以設計Rowkey就決定了未來你的查詢性能

3、hbase為什麼叫列式存儲

因為hbase列的可以動態增加,並且列為空就不存儲數據,節省存儲空間。

舉個例子吧,概念說多了也不直觀,如下:

1)Mysql結構化數據:你要指定一個表user,你必須預先定義好各個欄位,姓名、年齡、ID。後期要擴展新欄位麻煩

2)Hbase列式存儲:你只要設計好rowKey,定義好列簇,至於裡面什麼屬性,有多少欄位類型,無需預先定義好,擴展性極佳,需要的列欄位可以不停的增加。

也許前期你就姓名、年齡、ID三個欄位,未來你隨時可以存儲第四個欄位,第五個欄位,第n個欄位到你的列簇里,因為同一個列簇中的所有數據都存儲在一個文件里。


HBase應該叫列簇資料庫,而不是列資料庫。


key value是說邏輯上 實際上value被分割為列族


推薦閱讀:

HBase讀性能怎麼樣?
從百萬級別數據的分析角度,Mysql,Mongodb,Hbase如何選擇?
怎麼看hadoop的源碼,求大神指教?

TAG:資料庫 | HBase |