HBase以表的形式存儲數據。與關係型數據庫一樣,在HBase中,表由行和列組成。與關係型數據庫不同的是,HBase還有“列簇”(column family)的概念。一個表有若干“列簇”組成,每一個“列簇”包含若干列(column)。與此同時,表中的每一個cell都是有時間戳的。因此我們可以把其想象成一個三維數據庫。除了行和列之外,還有一個時間維度,每一個單元格(cell)的不同版本都被保存。
與關係型數據庫類似,在HBase中每一行都有一個主鍵(row key)。HBase對於數據的檢索都是通過row key進行的。HBase對於數據的檢索主要有三種方式:
1. 通過單個row key檢索一行
2. 通過row key的範圍[row key start,row key end]返回多條記錄
3. 全表掃描,返回整個table
在HBase中,所有的行都按照row key進行排序。在物理上,每一個table都會按照行劃分成一個或者多個HRegion。HRegion包含了table的一部分,即若干行。HRegion 按大小分割的,每個表一開始只有一個 HRegion,隨着數據不斷插入表, HRegion 不斷增大, 當增大到一個閥值的時候, HRegion 就會等分會兩個新的 HRegion。當 table 中的行不斷增多,就會有越來越多的HRegion。HRegion 是 Hbase 中分佈式存儲和負載均衡的最小單元。最小單元就表示不同的 HRegion 可以分佈在不同的 HRegion server 上。但一個 HRegion 是不會拆分到多個server上的。
HRegion 雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。事實上,HRegion 由一個或者多個 Store 組成,每個 store 保存一個 columns family。每個 Strore 又由一個 memStore 和0至多個 StoreFile 組成。 StoreFile 以 HFile 格式保存在 HDFS 上。除了HFile之外,HRegion server還生成另外一個文件——HLog(WAL log),該文件是一個日誌文件。WAL 意 爲 Write ahead log,類似 於mysql中的 binlog,用來做災難恢復使用。HLog 記錄數據的所有變更。n(來自不同 table)的日誌會混在一起。這樣做的目的是不斷追加單個文件相對於每個 HRegion Server 維護一個 Hlog,而不是每個HRegion 一個。這樣不同Regio同時寫多個文件而言,可以減少磁盤尋址次數,因此可以提高對 table 的寫性能。帶來的麻煩是,如果一臺 region server 下線, 爲了恢復其上的 region,需要將 region server 上的 log 進行拆分,然後分發到其它 region server 上進行恢復。