HBase簡介 資料模型

2021-09-24 14:02:01 字數 3908 閱讀 2225

目錄

hbase簡介

hbase資料模型

自動分割槽

hbase資料操作的實現

hbase體系結構

hbase是乙個在hdfs上開發的高可靠、高效能、面向列、可伸縮的分布式資料庫。hbase適用於實時地隨意訪問超大規模資料集。

發展前景

關於gfs和mapreduce

gfs是hdfs的前身,它使用商用硬體集群儲存海量資料。檔案系統將資料在節點之間冗餘複製達到高可靠性。它對資料的流式讀取也做了優化,可以邊處理邊讀取。

mapreduce是gfs架構的乙個補充,因為它能夠充分利用gfs集群中的每個商用伺服器提供的大量cpu。

不過這兩個系統都缺乏事實隨機訪問資料的能力,也就是說不足以處理web服務。gfs還有乙個缺陷,它適合儲存少量非常大的檔案,而不適於儲存大量的小檔案,因為檔案的元資料資訊是儲存在主節點的記憶體中的。

關於rdbms

關係型資料庫系統的可擴充套件性並不適合超大規模的資料集。

rdbms非常適合事務性操作,因為強調了資料的嚴格一致性,資料的操作是原子性的。而超大資料集的查詢需要進行大範圍的資料記錄掃瞄或全表掃瞄,在一台機器上做查詢工作的相響應時間可能會很長。

rdbms的等待和死鎖的出現頻率,與事務和併發的增加並不是線性關係,而是與併發數目的平方以及事務規模的3次方甚至5次方相關。此時分割槽,即邏輯上水平劃分資料儲存在多個檔案或伺服器上,需要客戶端採用複雜的方式和較高的代價來維護分割槽資訊。

rdbms若採用分割槽儲存資料,在故障處理時,就需要對故障節點上的資料進行複製。並且資料的分割槽中是固定範圍內進行的,在傳入資料之前,必須提前劃分資料的儲存範圍,若乙個劃分單位的資料量超過其提供的容量,就需要對資料充分去並遷移資料,這是非常消耗資源的操作。所以分割槽是完全脫離使用者操作的"事後"操作,非常難以安裝和維護。

rdbms通常是持久化儲存資料到磁碟中的,這可能會影響高速的讀/寫效能。並且若使用者有高度寫吞吐率大的需要,就需要考慮配置一套能夠隨著負載變化自動均衡處理能力的系統。

非關係型資料庫系統

這時候就需要考慮是否值得為了效能而放棄關係型特性。使用者可以通過反正規化化資料模式來避免等待;通過降低鎖粒度的方式來盡量避免死鎖;資料增加時無需重新分割槽遷移資料並內嵌水平擴充套件性;面對容錯和資料可用性的問題採用提高擴充套件性的機制,這就是非關係型資料庫系統not-only-sql(nosql)。而hbase就是乙個非關係型資料庫系統,所以hbase不支援sql查詢,查詢是通過客戶端api以純粹的命令完成的。

特點::hbase將資料存放在帶標籤的表中,表由行和列組成;

單元格:單元格由行和列的座標交叉決定,並且是有版本的,版本號由系統自動分配,為插入單元格時的時間戳,單元格的內容是未解釋的位元組陣列;

:行是由一列或多列組成的,並由唯一的行鍵來確定儲存的,行鍵也是字元陣列。所以理論上任何型別都可以通過表示成字串或者將二進位制形式轉化為long型(即8位元組)或直接對資料結構進行序列化來作為鍵值。表中的行根據鍵值進行排序,排序根據位元組序進行;

列族和列:若干列構成乙個列族,上圖中列image是列族contexts的成員,而format和gro屬於info族。這有助於構建資料的語義邊界或區域性邊界,還有助於給它們設定某些特性(如壓縮)或只是它們儲存在記憶體中。

同一列族的所有成員具有相同的字首,列族名必須由可列印的字元組成,而列名即列族修飾符可以為任意位元組。常見的引用列的格式為family:qualifier,列族和列族修飾符以冒號隔開。

列族需要在表建立時就定義好,並且不能修改得過於頻繁,並且資料也不能太多是有限制的。而列的數量沒有限制,並且可以隨後按需求加入。

所以hbase可以說是面向列族的儲存器。由於調優和儲存都是在列族層次上進行的,最好使所有列族成員都有相同的訪問模式和大小特徵。如上圖,較大的影象資料和較小的元資料儲存在不同的列族中。

hbase資料訪問模式:sortedmap>>>

第乙個sortedmap表示表,包含行鍵和對應的列族list。列族中包含了另乙個sortedmap儲存列和對應的值。這些值在第二個list中,儲存了值和該值被設定時的時間戳。

這種資料訪問模型單元格可以存在多個版本,api預設提供了乙個所有列的同一檢視,api會自動選擇單元格的當前值。比如上圖中的第一行資料:

contents:image中有兩個版本,可以通過電子錶的形式檢視資料,將時間戳新增到了自己那一列中:

儘管這些值插入的次數不同,並且存在多個版本,但依然能將行看做是所有列以及這些列的最新版本的組合,當在hbase shell中scan該錶時,該行資料為

在表中的第二行info:geo列內值為null,與rdbms不同的是,hbase會直接省略這一列,也就是說空值不占用任何儲存空間。

hbase中擴充套件和負載均衡的基本單元為region,hbase自動把錶水平劃分成區域。region本質上是以行鍵排序的連續儲存的區間,由表中行的子集構成。每個region由它所屬的表、所包含的第一行及最後一行(包前不包後)來表示。

一張表初始只有乙個region,當使用者開始向表中不斷插入資料時,系統會檢查這個region的大小,確保其不超過配置的最大值。如果超過了限制,系統會在中間鍵處將這個region拆分成兩個大致相等的子region。

每乙個region只能由一台region伺服器載入,而每一台region伺服器可以同時載入多個region。

region有些類似於hdfs中的塊,而regionserver扮演的是datanode的角色。

寫入資料

每次更新資料,都會先將資料記錄在提交日誌中,在hbase中稱為預寫日誌(write-ahead log,wal),然後才會將資料寫入到記憶體中的memstore(寫緩衝,記憶體中有多個menstore,保證了不必阻塞系統的讀寫,每乙個region中的每乙個column family對應乙個memstore)中,一旦記憶體儲存的寫入資料的累計大小超過了給定的最大值,系統會將這些資料移出記憶體作為hfile沖刷到磁碟中。資料離開記憶體後, 系統會捨棄對應的提交日誌,只保留未持久化到磁碟中的提交日誌。memstore中的資料已經按照行鍵排序,所以磁碟中的hfile也是按照此順序排序的。

刪除資料

由於hfile是不可改變的,所以無法直接移除某個記錄,hbase中會為指定行做個刪除標記(delete maker)。在檢索時刪除標記掩蓋了實際值,客戶端遍讀不到實際值。

讀取資料

讀取的資料是兩部分資料合併的結構,一部分是menstore中還沒有寫入磁碟的資料,另一部分是磁碟上的hfile。資料檢索時並不會用到wal,只有伺服器記憶體中的資料在伺服器故障還未寫入到磁碟時,而後進行恢復資料時才會用到wal。

儲存資料

乙個列族的所有列儲存在同乙個底層的儲存檔案中,這個儲存檔案叫做hfile。hfile通常儲存在hdfs中,hfile中儲存的是經過排序的鍵值對映結構。檔案內由連續的塊組成,塊的預設大小為64k,塊的索引資訊儲存在檔案的尾部。當開啟hfile並載入到記憶體中時,索引資訊會優先載入到記憶體中。每個hfile都有乙個塊索引,首先在記憶體的塊索引中進行二分查詢,確定可能包含給定鍵的塊,然後讀取磁碟塊找到實際要找的鍵。

隨著menstore中的資料不斷沖刷到磁碟中,會產生越來越多的hfile,hdfs中乙個column family可能對應多個hfile,hbase內部會將多個檔案合併成乙個較大的檔案。合併有兩種型別:minor合併和major合併。

hbase資料模型

與nosql資料庫們一樣,rowkey是用來檢索記錄的主鍵。訪問hbase table中的行 訪問方式 a.通過單個row key訪問,b.通過row key的range 正則 c.全表掃瞄,rowkey是任意字串,最大長度 是 64kb,實際應用中長度一般為 10 100bytes,hbase內部...

Hbase資料模型

hbase 以表的形式儲存資料。表由行和列族組成。列劃分為若干個列族 row family 其邏輯檢視如下 幾個關鍵概念 1 行鍵 rowkey 行鍵是位元組陣列,任何字串都可以作為行鍵 表中的行根據行鍵進行排序,資料按照 row key 的位元組序 byte order 排序 儲存 所有對錶的訪問...

hbase資料模型

與nosql資料庫一樣,row key是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式 1.通過單個row key訪問 2.通過row key的range 正則 3.全表掃瞄 row key行鍵 row key 可以是任意字串 最大長度 是 64kb,實際應用中長度一般為 10 ...