在 HBase 中,資料存盤在有行和列的表中,這是與關系資料庫 (RDBMS) 的術語重疊,但這不是一個有用的類比,相反,將 HBase 表視為多維映射可能會對理解更有所幫助,
先來看下hbase表模型的專業術語
- table (表):一個 HBase 表由多行組成,
- row(行):HBase 中的一行由一個行鍵和一個或多個具有與其關聯的值的列組成,行在存盤時按行鍵的字母順序排序,為此,行鍵的設計非常重要,目標是以相關行彼此靠近的方式存盤資料,常見的行鍵模式是網站域,如果您的行鍵是域,您可能應該將它們反向存盤(org.apache.www、org.apache.mail、org.apache.jira),這樣,所有 Apache 域都在表中彼此靠近,而不是根據子域的第一個字母展開,
- column(列):HBase 中的列由列族和列限定符組成,它們由
:(冒號)字符分隔,比如列contents:html由列族contents和限定符html組成 - Column Family (列族):Apache HBase中的列被分組為列族,列族中的所有列成員具有相同的前綴,例如,courses:history和courses:math這兩個欄目都是courses欄目家族的成員,冒號字符(:)將列族與列族限定符分隔開來,列族前綴必須由可列印字符組成,列族必須在模式定義時預先宣告,而列不需要在模式定義時定義,但可以在表啟動和運行時動態更改,物理上,所有列家族成員都存盤在檔案系統上,因為調優和存盤規范是在列族級別進行的,所以建議所有列族成員具有相同的通用訪問模式和大小特征,
- Column Qualifier(列限定符):列限定符被添加到列族中以提供給定資料的索引,給定一個列族
content,一個列限定符可能是content:html,另一個可能是content:pdf,盡管列族在表創建時是固定的,但列限定符是可變的,并且在行之間可能會有很大差異, - cell(單元格)::一個{row, column, version}元組精確指定了HBase中的一個單元格cell,單元格內容是未解釋的二進制位元組,包含一個值和一個時間戳,它代表值的版本
- Timestamp(時間戳):每個值旁邊都有一個時間戳,它是一個給定版本的值的識別符號,默認情況下,時間戳表示寫入資料時 RegionServer 上的時間,但您可以在將資料放入單元格時指定不同的時間戳值,
Hbase概念視圖與本質
假如有一個名為webtable的表,它包含兩行(com.cnn.www和com.example.www)和三個列族,分別是contents、anchor和people,
在這個例子中,對于第一行(com.cnn.www), anchor包含兩列(anchor:cssnsi.com, anchor:my.look.ca), contents包含一列(contents:html),這個例子包含行鍵為com.cnn.www的5個版本,以及行鍵為com.example.www的一個版本,
表webtable

此表中看起來為空的單元格不占用空間,或者實際上存在于 HBase 中,這就是 HBase“稀疏”的原因,表格視圖不是查看 HBase 中資料的唯一可能方式,甚至不是最準確的方式,以下表示與多維map相同的資訊,但注意這只是用于說明Hbase模型,可能并不完全準確,
表webtable的 Hbase Map視圖

只是這里Hbase 使用的 Map 的主鍵更加復雜,是一個復合鍵由 row key行鍵 、column key列族(一個列族里可以在使用時任意添加拓展列,百萬列的級別) ,qualifier列(也稱限定符),type和 timestamp構成的KV鍵值對,
如上,其實我們發現每個鍵都指向一個包含3個鍵的映射:“contents”,“anchor”和“people”,這個我們稱之為列族,列族的定義設定其實也就定義了多維map的框架是什么樣,也就是第二層map的個數,我們又可以在第二層每個map里添加任意多個kv(map)鍵值對,是為列和列值,表的列族是在創建表時指定的,以后很難或不可能修改,添加新的列族也可能很昂貴,因此最好預先指定您需要的所有列族,
Hbase/BigTable 中表示的最后一個維度是時間,所有資料都使用整數時間戳(自紀元以來的秒數)或您選擇的另一個整數進行版本控制,客戶端可以在插入資料時指定時間戳,如上,同一個rowkey com.cnn.www 的contents:html的值就有多個時間版本,

Hbase實際的物理視圖
盡管在概念級別Hbase表可能被視為一組稀疏的行,但它們在物理上是按列族存盤的,可以隨時將新的列限定符 (column_family:column_qualifier) 添加到現有列族中,
如上圖所示,很好地闡述了hbase資料存盤結構,但尤其注意同一個rowkey多個時間戳,不同列族列缺失的情況,是如何存盤的,如下:
概念視圖中顯示的空單元格根本沒有存盤,稀疏的,因此,對contents:html時間戳列的值的請求t8將不回傳任何值,因為t8這個時間戳只有anchor列族有值,而content列族是缺失的,同樣,對anchor:my.look.ca時間戳值的請求t9不會回傳任何值,但是,如果未提供時間戳,則將回傳特定列的最新值,給定多個版本,最新的也是第一個找到的,因為時間戳是按降序存盤的,
注意,假如一個rowkey:com.cnn.www的請求未指定時間戳,則對行中所有列的值的請求結果將是:contents:html 的timestamp 為t6的值,anchor:cnnsi.com的則是 timestamp為t9的值、anchor:my.look.ca的timestamp為t8 的值,即回傳每個rowkey 列族的最新timestamp對應的cell值,

參考檔案:帶你學習不一樣的Hbase|概述|核心原理_滌生手記-CSDN博客_如何學習hbase
Understanding HBase and BigTable - DZone
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302197.html
標籤:其他
