標籤:http strong 檔案 資料 io cti
HBase是面向列的分布式的資料庫,和傳統的關係型資料庫有很大的不同:物理模型和邏輯模型。這裡我們要首先講一下HBase資料庫相關的區別於關係型資料庫的幾個基本概念:
表:HBase將資料群組織到自己的HTable表中,這個表是根據列族(colomn family)在物理上儲存資料的,每個列族都有自己的檔案夾和storefiles,不像關係型資料庫那樣將一個表儲存成一個檔案,表明也是檔案系統路徑的一部分。
行:HBase中的行是邏輯上的行,物理上模型上行是按列族(colomn family)分別存取的。HBase有Rowkey的概念,rowkwy沒有資料類型,總是被認為是byte[],它相當於關係型資料表中的主鍵。另外Rowkey設計的好壞對讀取資料有很長大的關係,可以被認為是設計HBase表是最重要的一個環節。而系型資料表中的行是真正意義上的行,邏輯上和物理上都是按行組織資料。
列族:HBase表中的行是按一個叫colomn family的列族分組的,也是在磁碟上也是按列族儲存資料的,由於這個原因,故當定義一個hbase表時,除了定義表名外,還必須定義列族。傳統資料庫沒有列族的概念。
列標識:一個列族中的資料是通過一個叫colomn qualifier的具體描述每一列。列標識在標定一種可以動態定義,既可以在表定義時定義,也可以在儲存資料時定義。而系型資料庫的表沒有此概念。
版本:HBase中的資料有版本的概念,每次產生或修改資料時都儲存一個版本資訊——這個版本資料就是一個時間戳記,可以再定義表時動態設定儲存行的版本數量,預設版本數為1,同一行的不同版本的資料是按時間戳記倒敘排列的,而其他資料如rowkey和列標識是按字典順序排列的,這也是讀資料操作的一種最佳化手段。對於某一行,當儲存的行的版本數大於設定的值後,最老的版本的資料行就會在執行Major compaction時被刪除掉。版本資料是預設添加的,其值時儲存資料時的時間戳記,long型(長整型)。而系型資料庫的表沒有此概念。
Cell:在HBase表中,是由rowkey + (colomn family:colomn qualifier) + version來標識一個cell,使用者儲存的具體資料是儲存在這個cell中的,它的值時byte[]類型的,需要在用戶端將之改為需要的類型。
table、row、rowkey、colomn family、colomn qualifier、version(timestamp)和cell
對於可以看出:
rowkey ->jacky20130429 jacky20130430
comlom family -> info events
version ->t3 t6 t9等
colomn qualifier -> email sex address type name
對於表的2個列族info和events,會被分別儲存到磁碟上。
由於【jacky20130429,info,email,t9】 ------> [email protected],故HBase可以被看做是key-value的資料庫。另外,HBase也可以被看做有排序的Map的Map:
SortedMap<
Rowkey,List<
SortedMap<
Colomn,List<
value,timestamp
>
>
>
>
第一層的SortedMap代表HBase的HTable,包括一個colomn families的集合,每個列族包括又一層的SortedMap,這層的SortedMap裡包括列和相關聯的資料的集合。
HBase表中的行是有原子性的,但是一行的不同版本可能分布在不同的storefile檔案中,到期失效的資料只能在Major Compaction操作時刪除。