關系數據庫大家都不陌生,使用一個RDBMS和HBase例子來說明。
RDBMS例子:

數據:

對比:
那HBASE是什么樣的了?
表設計:

數據:

HBASE表的基本概念:
Row key:行主鍵, HBase不支持條件查詢和Order by等查詢,讀取記錄只能按Row key(及其range)或全表掃描,因此Row key需要根據業務來設計以利用其存儲排序特性(Table按Row key字典序排序如1,10,100,11,2)提高性能。
Column Family(列族):在表創建時聲明,每個Column Family為一個存儲單元。在上例中表有兩個列族:article和author。
Column(列):HBase的每個列都屬於一個列族,以列族名為前綴,如列article:title和article:content屬於article列族。Column不用創建表時定義即可以動態新增,同一Column Family的Columns會群聚在一個存儲單元上,並依Column key排序,因此設計時應將具有相同I/O特性的Column設計在一個Column Family上以提高性能。同時這里需要注意的是:這個列是可以增加和刪除的,這和我們的傳統數據庫很大的區別。所以他適合非結構化數據。
Timestamp:HBase通過row和column確定一份數據,這份數據的值可能有多個版本,不同版本的值按照時間倒序排序,即最新的數據排在最前面,查詢時默認返回最新版本。
Value:每個值通過4個鍵唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value,例如上例中{tableName=’blog’,RowKey=’1’,ColumnName=’author:nickname’, Timestamp=’ 1317180718830’} 索引到的唯一值是“yedu”。
存儲類型:
TableName 是字符串
RowKey 和 ColumnName 是二進制值(Java 類型 byte[])
Timestamp 是一個 64 位整數(Java 類型 long)
value 是一個字節數組(Java類型 byte[])。
HBase使用場景:
半結構化或非結構化數據:對於數據結構字段不夠確定或雜亂無章很難按一個概念去進行抽取的數據適合用HBase。以上面的例子為例,當業務發展需要存儲author的email,phone,address信息時RDBMS需要停機維護,而HBase支持動態增加。
記錄非常稀疏:RDBMS的行有多少列是固定的,為null的列浪費了存儲空間。而如上文提到的,HBase為null的Column不會被存儲,這樣既節省了空間又提高了讀性能。
多版本數據:上文提到的根據Row key和Column key定位到的Value可以有任意數量的版本值,因此對於需要存儲變動歷史記錄的數據,用HBase就非常方便了。比如上例中的author的Address是會變動的,業務上一般只需要最新的值,但有時可能需要查詢到歷史值。
超大數據量:當數據量越來越大,RDBMS數據庫撐不住了,需要分庫分表。大數據的HBase就簡單了,只需要加機器即可,HBase會自動水平切分擴展,跟Hadoop的無縫集成保障了其數據可靠性(HDFS)和海量數據分析的高性能(MapReduce)
