轉載請註明出處:
1.Hbase資料特點
-
大:一個表可以有上億行,上百萬列。
-
面向列:面向列表(簇)的儲存和許可權控制,列(簇)獨立檢索。
-
稀疏:對於為空(NULL)的列,並不佔用儲存空間,因此,表可以設計的非常稀疏。
-
無模式:每一行都有一個可以排序的主鍵和任意多的列,列可以根據需要動態增加,同一張表中不同的行可以有截然不同的列。
-
資料多版本:每個單元中的資料可以有多個版本,預設情況下,版本號自動分配,版本號就是單元格插入時的時間戳。
-
資料型別單一:HBase中的資料都是字串,沒有型別。
2.HBase的資料結構
HBase也可以作為一個資料庫使用,但是為了應對海量資料,他儲存資料的方式 與我們理解的傳統關係型資料庫有很大的區別。雖然他也有表、列這樣的邏輯結 構,但是整體上,他是以一種k-v鍵值對的方式來儲存資料的:
縱向來看,HBase中的每張表由Rowkey和若干個列族或者稱為列簇組成。其中 Rowkey是每一行資料的唯一標識,在對資料進行管理時,必須自行保證Rowkey的 唯一性。接下來HBase依然會以不同的列來管理資料,但是這些列分別歸屬於不同 的列簇。在HBase中,同一張表的資料,只需要保證列簇是相同的,而列簇下的 列,可以是不相同的。所以由此可以擴充套件出非常多的列。在HBase中,對於同一張 表,不建議定義過多的列簇,通常不要超過三個。而更多的資料,可以以列的方式 來擴充套件。
從橫向來看,HBase中的記錄,會劃分為一個一個的Region,儲存在不同的 RegionServer上。並且會在不同的RegionServer之前形成備份,以Region為單位 提供了故障後自動恢復的機制。
最後,從整體來看,HBase雖然還是以HDFS作為檔案儲存,但是他儲存的資料不 再是簡單的文字檔案,而是經過HBase最佳化壓縮過的二進位制檔案,所以他的儲存文 件通常是不能夠直接檢視的。
2.1 Row Key
與 NoSQL 資料庫一樣,Row Key 是用來檢索記錄的主鍵。訪問 HBase table 中的行,只有三種方式:
-
透過單個 Row Key 訪問。
-
透過 Row Key 的 range 全表掃描。
-
Row Key 可以使任意字串(最大長度是64KB,實際應用中長度一般為 10 ~ 100bytes),在HBase 內部,Row Key 儲存為位元組陣列。
在儲存時,資料按照 Row Key 的字典序(byte order)排序儲存。設計 Key 時,要充分排序儲存這個特性,將經常一起讀取的行儲存到一起(位置相關性)。
注意 字典序對 int 排序的結果是 1,10,100,11,12,13,14,15,16,17,18,19,20,21,…, 9,91,92,93,94,95,96,97,98,99。要儲存整形的自然序,Row Key 必須用 0 進行左填充。
行的一次讀寫是原子操作(不論一次讀寫多少列)。這個設計決策能夠使使用者很容易理解程式在對同一個行進行併發更新操作時的行為。
2.2 列族
HBase 表中的每個列都歸屬於某個列族。列族是表的 Schema 的一部分(而列不是),必須在使用表之前定義。列名都以列族作為字首,例如 courses:history、courses:math 都屬於 courses 這個列族。
訪問控制、磁碟和記憶體的使用統計都是在列族層面進行的。在實際應用中,列族上的控制許可權能幫助我們管理不同型別的應用, 例如,允許一些應用可以新增新的基本資料、一些應用可以讀取基本資料並建立繼承的列族、 一些應用則只允許瀏覽資料(甚至可能因為隱私的原因不能瀏覽所有資料)。
3.HBase的基礎架構
從HBase的架構圖上可以看出,HBase中的元件包括Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等;
其中,
- client客戶端包含了訪問HBase的介面,另外也維護了對應的快取來加速對 HBase的訪問。
- RegionServer直接對接使用者的讀寫請求,是真正幹活的節點。他會將資料以 StoreFile的形式儲存到不同的HDFS目錄中。
- HMaster主要是維護一些叢集的後設資料資訊,同時監控RegionServer的服務狀 態,並且透過Zookeeper提供叢集服務,向客戶端暴露叢集的服務端資訊
HBase中的每張表都透過行鍵按照一定的範圍被分割成多個子表(HRegion),預設一個HRegion超過256M就要被分割成兩個,這個過程由HRegionServer管理,而HRegion的分配由HMaster管理。
Table 在行的方向上分割為多個HRegion,每個HRegion分散在不同的RegionServer中。每個HRegion由多個Store構成,每個Store由一個memStore和0或多個StoreFile組成,每個Store儲存一個Columns Family。