天天看點

Hbase

對于資料結構字段不夠确定或雜亂無章很難按一個概念去進行抽取的資料适合用HBase。當業務發展需要增加存儲比如一個使用者的email,phone,address資訊時RDBMS需要停機維護,而HBase支援動态增加.

記錄非常稀疏

RDBMS的行有多少列是固定的,為null的列浪費了存儲空間。而如上文提到的,HBase為null的Column不會被存儲,這樣既節省了空間又提高了讀性能。

多版本資料

根據Row key和Column key定位到的Value可以有任意數量的版本值,是以對于需要存儲變動曆史記錄的資料,用HBase就非常友善了。對于某一值,業務上一般隻需要最新的值,但有時可能需要查詢到曆史值。

超大資料量

當資料量越來越大,RDBMS資料庫撐不住了,就出現了讀寫分離政策,通過一個Master專門負責寫操作,多個Slave負責讀操作,伺服器成本倍增。随着壓力增加,Master撐不住了,這時就要分庫了,把關聯不大的資料分開部署,一些join查詢不能用了,需要借助中間層。随着資料量的進一步增加,一個表的記錄越來越大,查詢就變得很慢,于是又得搞分表,比如按ID取模分成多個表以減少單個表的記錄數。經曆過這些事的人都知道過程是多麼的折騰。采用HBase就簡單了,隻需要加機器即可,HBase會自動水準切分擴充,跟Hadoop的無縫內建保障了其資料可靠性(HDFS)和海量資料分析的高性能(MapReduce)

Row key

行主鍵, HBase不支援條件查詢和Order by等查詢,讀取記錄隻能按Row key(及其range)或全表掃描,是以Row key需要根據業務來設計以利用其存儲排序特性(Table按Row key字典序排序如1,10,100,11,2)提高性能。

Column Family(列族)

在表建立時聲明,每個Column Family為一個存儲單元。

Column(列)

HBase的每個列都屬于一個列族,以列族名為字首,如列article:title和article:content屬于article列族,author:name和author:nickname屬于author列族。

Column不用建立表時定義即可以動态新增,同一Column Family的Columns會群聚在一個存儲單元上,并依Column key排序,是以設計時應将具有相同I/O特性的Column設計在一個Column Family上以提高性能。

Timestamp

HBase通過row和column确定一份資料,這份資料的值可能有多個版本,不同版本的值按照時間倒序排序,即最新的資料排在最前面,查詢時預設傳回最新版本。Timestamp預設為系統目前時間(精确到毫秒),也可以在寫入資料時指定該值。

Value

每個值通過4個鍵唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value

存儲類型

TableName 是字元串

RowKey 和 ColumnName 是二進制值(Java 類型 byte[])

Timestamp 是一個 64 位整數(Java 類型 long)

value 是一個位元組數組(Java類型 byte[])。

将HTable的存儲結構了解為

Hbase

即HTable按Row key自動排序,每個Row包含任意數量個Columns,Columns之間按Column key自動排序,每個Column包含任意數量個Values。了解該存儲結構将有助于查詢結果的疊代。

列族的數量以及列族的勢

列族的數量越少越好,牽扯到了hbase的flushing;同一個表中不同列族所存儲的記錄數量的差别也需要考慮(列族的勢),會造成記錄數量少的列族的資料分散在多個region上,影響查詢效率。

行鍵的設計

避免使用時序或者單調(遞增/遞減)行鍵,否則會導緻連續到來的資料會被配置設定到統一region中。

盡量最小化行鍵和列族的大小

避免hbase的索引過大,加重系統存儲的負擔

版本的數量

HColumnDescriptor設定版本的數量,避免設定過大,版本保留過多。