1. 程式人生 > >HBase 是列式存儲數據庫嗎

HBase 是列式存儲數據庫嗎

解釋 正文 進行 data- hfile efault _id 順序 fff

在介紹 HBase 是不是列式存儲數據庫之前,我們先來了解一下什麽是行式數據庫和列式數據庫。

行式數據庫和列式數據庫

在維基百科裏面,對行式數據庫和列式數據庫的定義為:
列式數據庫是以列相關存儲架構進行數據存儲的數據庫,主要適合於批量數據處理(OLAP)和即時查詢。
相對應的是行式數據庫,數據以行相關的存儲體系架構進行空間分配,主要適合於小批量的數據處理,常用於聯機事務型數據處理(OLTP)。

比如我們有以下的表格:

技術分享圖片

那麽行式數據庫和列式數據庫存儲模型分別如上面的左圖和右圖。
可以看到,行式數據一行的數據是在相鄰位置存儲的;而列式數據相同列是相鄰存儲的,比如上面的 session_id 這列是放在一起存儲的。

HBase 是列式數據庫嗎

現在我們已經了解了行式數據庫和列式數據庫的存儲格式的簡單區別了。
那麽進入正文,我們來看下 HBase 是不是列式數據庫。
很多地方介紹 HBase 有這麽一句話:HBase is a column-oriented database management system that runs on top of Hadoop Distributed File System (HDFS)
註意裏面的 column-oriented 一詞,很多資料或者初學者都把它翻譯成列式,這句話就中文翻譯就變成 HBase 是運行在 HDFS 之上的列式數據庫管理系統
那麽 HBase 到底是不是列式存儲呢?
其實 HBase 不是列式存儲數據庫


本文就從底層存儲模式來解釋這個。

不管是存儲在內存的 MemStore,還是存儲在 HDFS 上的 HFile,其都是基於 LSM(Log-Structured Merge-Tree)結構存儲的。
下圖有助於我們簡單理解 MemStore 和 HFile 是怎麽存儲數據的,假設我們有以下一張 HBase 表。

技術分享圖片

那麽,HBase 底層的 KV 存儲大概如下所示的:

技術分享圖片

從上圖可以看出:

  • 不同的列族存在不同的文件中(上面兩個表格代表不同的 HFile);
  • 整個數據是按照 Rowkey 進行字典排序的;
  • 每一列數據在底層 HFile 中是以 KV 形式存儲的;
  • 相同的一行數據中,如果列族也一樣,那麽這些數據是順序放在一起的。

到這裏大家應該可以看到,HBase 其實不是列式數據庫,因為同一行數據,如果列族也一樣,這些數據是存儲在相鄰位置的;這和上面的列式存儲不太一樣。
所以說,HBase 既不像行式存儲,又不像列式存儲。它其實更像是面向列族的存儲數據庫,因為不同行相同的列族數據是相鄰存儲的;而同一行不同列族的數據是存儲在不同位置的。

註意:HBase實際存儲在hdfs上的形式:/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>

這也是創建表時,必須指定表名與列族的原因!

所以 HBase is a column-oriented database management system that runs on top of Hadoop Distributed File System (HDFS) 這句話應該翻譯成 HBase 是運行在 HDFS 之上的面向列的數據庫管理系統。

HBase 是列式存儲數據庫嗎