HBase 是列式儲存資料庫嗎
在介紹 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 之上的面向列的資料庫管理系統。