目錄
簡介
設計模型
邏輯結構
實體結構
簡介
HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase可在廉價伺服器上搭建起大規模結構化存儲叢集。是Apache軟體基金會的Hadoop項目的一部分,運作于HDFS檔案系統之上,是以可以容錯地存儲海量稀疏的資料。
HBase是一個開源的非關系型分布式資料庫(NoSQL),它參考了谷歌的BigTable模組化,使用Java語言進行實作。但是也有很多不同之處。比如:
Google BigTable | Hadoop HBase | |
---|---|---|
檔案存儲系統 | GFS | HDFS |
計算引擎 | MAPREDUCE | Hadoop MapReduce |
一緻性協調服務 | Chubby | Zookeeper |
設計模型
下面我們通過資料存儲結構來了解一下HBase的各個元件,從邏輯上來看,HBase中的資料模型和RDBMS很類似,資料存儲在一個二維表中,有行和列,但從實體存儲上來看,HBase是以KV形式進行存儲的,更像是一個multi-dimensional map。
邏輯結構

- namespace(命名空間):類似資料庫中的database,命名空間下可以有多個HBase 表。HBase 有兩個自帶的命名空間,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 是使用者預設使用的命名空間。
- Region:類似資料庫的表,不同的是,Hbase定義表的時候隻需要聲明列族即可,不需要聲明具體的列。這意味着,往 HBase 寫入資料時,字段可以動态、按需指定。是以,和關系型資料庫相比,HBase 能夠輕松應對字段變更的場景。同時,一個HBase表中可以有1~n個Region。
- Row(行):HBase中每行資料都由一個 RowKey(行鍵) 和多個 Column(列)組成,資料是按照 RowKey的字典順序存儲的(如:上圖的row_key10排在row_key2前面),RowKey 的設計十分重要,查詢資料時隻能根據 RowKey 進行檢索:
- 指定rowkey查詢
- 指定rowkey區間查詢
- 全表掃描
- Column Family(列族):HBase 中的列被分組為列族。列族的所有列成員具有相同的字首。例如 cf_wyk:name,cf_wyk:age 都是 cf_wyk 列族的成員。冒号字元(:)從列族限定符中分隔列族。在實體上,同一列族内成員一起存儲在檔案系統上,是以建議所有同一列族内的成員具有相同的一般通路模式和大小特征。
- Column(列):HBase 中的每個列都由 Column Family(列族)和 Column Qualifier(列限定符)進行限定,例如cf_wyk:name,cf_wyk:age。建表時,隻需指明列族,而列限定符無需預先定義。
- Store:HBase表按照列族将同一列族内的資料存儲在同一個檔案夾内,按照Region将表進行橫向切片,經過這兩種切分之後得到的store就是真實存儲資料的檔案,該資料存儲在HDFS内。
- Cell:由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的資料單元。cell 中的資料是沒有類型的,全部以位元組碼形式存儲。
解讀上圖:在hbase中namespace為default,表名為wyk_csdn,有兩個列族cf_csdn,cf_wyk,分别有下面幾個列cf_csdn:host,cf_csdn:port,cf_csdn:alias,cf_wyk:name,cf_wyk:age。有8條記錄被分别放置在三個region内,且在每個region内是按照字典排序。
實體結構
在上面介紹了資料是存儲在storefile内的,下面我們來看一下storefile記憶體儲了什麼樣的資料,如上圖,其中Rowkey,列族(Column Family),列限定符(列),和值(Value)我們都知道是什麼,剩下兩個新面孔我們來看一下:
- Timestamp(時間戳):用于辨別資料的不同版本(version),每條資料寫入時,如果不指定時間戳,系統會自動為其加上該字段,其值為資料寫入 HBase 的時間。時間戳在HBase中是非常重要的一個名額。
- Type(操作類型):對HBase資料進行增改操作時類型為Put,進行删除操作時該類型為Delete,進行查詢操作不會産生資料修改,是以不會記錄在資料内。
解讀上圖:該表中rowkey為row_key8,列族為cf_wyk的資料存儲情況,其中在t1時間點新增了資料{wyk7,26},在t2時間點修改age=27,在t3時間點修改age=28,雖然在storefile中age列存了三個記錄,但在查詢資料時隻能查到age=28的結果,這就是因為時間戳t3是最新的,是以在查詢資料時如果沒有指定版本則隻會傳回最新版。
希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!