HBase概述(概念、數據模型、特點和優勢)


HBase是什麼?

HBase是一個高可靠性高性能面向列可伸縮的分佈式存儲系統,目標是存儲並處理大型的數據,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集羣。
因此我們說HBase是大量廉價的機器解決海量數據的高速存儲和讀取的分佈式數據庫解決方案。

  • HBase利用Hadoop HDFS作爲其文件存儲系統。
  • HBase利用Hadoop MapReduce來處理HBase中的海量數據。
  • HBase利用Zookeeper爲其提供穩定服務和Failover機制。

HBase與RDBMS對比

  1. 數據類型:關係數據庫採用關係模型,具有豐富的數據類型和存儲方式,HBase則採用了更加簡單的數據模型,它把數據存儲爲未經解釋的字符串。
  2. 數據操作:關係數據庫中包含了豐富的操作,其中會涉及複雜的多表連接。HBase操作則不存在複雜的表與表之間的關係,只有簡單的插入、查詢、刪除、清空等,因爲HBase在設計上就避免了複雜的表和表之間的關係。
  3. 存儲模式:關係數據庫是基於行模式存儲的。HBase是基於列存儲的,每個列族都由幾個文件保存,不同列族的文件是分離的。
  4. 數據索引:關係數據庫通常可以針對不同列構建複雜的多個索引,以提高數據訪問性能。HBase只有一個索引——行鍵,通過巧妙的設計,HBase中的所有訪問方法,或者通過行鍵訪問,或者通過行鍵掃描,從而使得整個系統不會慢下來。
  5. 數據維護:在關係數據庫中,更新操作會用最新的當前值去替換記錄中原來的舊值,舊值被覆蓋後就不會存在。而在HBase中執行更新操作時,並不會刪除數據舊的版本,而是生成一個新的版本,舊有的版本仍然保留。
  6. 可伸縮性:關係數據庫很難實現橫向擴展,縱向擴展的空間也比較有限。相反,HBase和BigTable這些分佈式數據庫就是爲了實現靈活的水平擴展而開發的,能夠輕易地通過在集羣中增加或者減少硬件數量來實現性能的伸縮。

數據模型

HBase的數據模型,分兩大類namespace,table,其實就是對應RDBMS中的庫和表。其中表的數據模型又包含有row key+columns family+cell+timestamp。下面具體講解namespace和table的數據模型。

NameSpace

命名空間類似關係數據庫系統中的數據庫,是表的邏輯分組。通過命名空間我們可以對錶分組,對於不同的組我們可以進行不同的環境設定,如配額管理、安全管理等。
創建命名空間

create_namespace 'my_ns'
create_namespace 'my_ns', {'PROPERTY_NAME' => 'PROPERTY_VALUE'}

刪除命名空間

drop_namespace 'my_ns'

HBASE自帶有兩個命名空間:default 、hbase

hbase:系統命名空間,有兩個重要的表,meta–>用於存儲元數據,namespace–>存儲hbase命名空間的表。

list_namespace_tables 'hbase'
TABLE                                                                                                                                                                                                  
meta                                                                                                                                                                                                   
namespace                                                                                                                                                                                              
2 row(s) in 0.1500 seconds

查看meta中存儲的元信息:

scan 'hbase:meta'
ROW                                                COLUMN+CELL                                                                                                                                         
 event_logs20151220,,1530701175275.59026af14c40aa5 column=info:regioninfo, timestamp=1530701176568, value={ENCODED => 59026af14c40aa514f9db4b92911e96a, NAME => 'event_logs20151220,,1530701175275.5902
 14f9db4b92911e96a.                                6af14c40aa514f9db4b92911e96a.', STARTKEY => '', ENDKEY => '1450570479953'}                                                                          
 event_logs20151220,,1530701175275.59026af14c40aa5 column=info:seqnumDuringOpen, timestamp=1586011645162, value=\x00\x00\x00\x00\x00\x00\x00\x16                                                       
 14f9db4b92911e96a.                                                                                                                                                                                    
 event_logs20151220,,1530701175275.59026af14c40aa5 column=info:server, timestamp=1586011645162, value=localhost:60020                                                                                  
 14f9db4b92911e96a. 

default – 沒有顯式指定命名空間的表,將自動落入此命名空間

Table

Row Key

row key是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:
1.通過單個row key訪問
2.通過row key的range(正則)
3.全表掃描
Row key可以是任意字符串(最大長度 是 64KB,實際應用中長度一般爲 10-100bytes),在HBASE內部,row key保存爲字節數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分利用排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)。Rowkey對Hbase的性能影響非常大,Rowkey的設計尤爲重要。

Columns Family

  • Column Family又叫列族,Hbase通過列族劃分數據的存儲,列族下面可以包含任意多的列,實現靈活的數據存取。可以類比爲家族,一個家族是由於很多個的家庭組成的,同理列族是由很多的列組成。
  • Hbase表的創建的時候就必須定義列族。就像關係型數據庫創建的時候必須指定具體的列是一樣的。
  • Hbase的列族不是越多越好,官方推薦的是列族最好小於或者等於3。我們使用的場景一般是1個列族。
  • HBase表中的每個列,都歸屬於某個列族。列名都以列族作爲前綴。例如 courses:history,courses:math都屬於courses這個列族。新的列族成員(列)可以隨後按需、動態加入,Family下面可以有多個Qualifier,所以可以簡單的理解爲,HBase中的列是二級列,也就是說Family是第一級列,Qualifier是第二級列。兩個是父子關係。
  • 權限控制、存儲以及調優都是在列族層面進行的。
  • HBase把同一列族裏面的數據存儲在同一目錄下,由幾個文件保存。

TimeStamp

每個cell都保存着同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是64位整型。
時間戳可以由HBase在數據寫入時自動賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
TimeStamp對Hbase來說至關重要,因爲它是實現Hbase多版本的關鍵。在Hbase中使用不同的timestame來標識相同rowkey行對應的不同版本的數據。
在Hbase中,相同rowkey的數據按照timestamp倒序排列。默認查詢的是最新的版本,用戶可同指定timestamp的值來讀取舊版本的數據。
爲了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,HBase提供了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。

Cell

  • 由行和列的座標交叉決定;
  • 單元格是有版本的(由時間戳來作爲版本);
  • 單元格的內容是未解析的字節數組(Byte[]),cell中的數據是沒有類型的,全部是字節碼形式存貯。
    • 由{row key,column(= +),version}唯一確定的單元。

HBase的特點

HBASE的特點主要爲海量存儲、稀疏存儲、列存儲、易擴展。

海量存儲
Hbase適合存儲PB級別的海量數據,在PB級別的數據以及採用廉價PC存儲的情況下,能在幾十到百毫秒內返回數據。這與Hbase的極易擴展性息息相關。正式因爲Hbase良好的擴展性,才爲海量數據的存儲提供了便利。

列式存儲
Hbase是根據列族來存儲數據的。列族下面可以有非常多的列,列族在創建表的時候就必須指定,而列是動態的。

易擴展
Hbase的擴展性主要體現在兩個方面,一個是基於上層處理能力(HRegionServer)的擴展,一個是基於存儲的擴展(HDFS)

稀疏存儲
不同於傳統RDBMS,null也佔用空間,HBase在列數據爲空的情況下,是不會佔用存儲空間的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章