目錄
百科
HBase是一個分佈式的、面向列的開源數據庫,該技術來源於 Fay Chang 所撰寫的Google論文“Bigtable:一個結構化數據的分佈式存儲系統”。就像Bigtable利用了Google文件系統(File System)所提供的分佈式數據存儲一樣,HBase在Hadoop之上提供了類似於Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不同於一般的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另一個不同的是HBase基於列的而不是基於行的模式。
總結起來就是:
1.hbase是bigtable的開源版本;
2.是建立的hdfs之上,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫的數據庫系統;
3.它不同於關係數據庫,它僅能通過主鍵(row key)和主鍵的range來檢索數據;
4.僅支持單行事務;
5.主要用來存儲非結構化和半結構化的鬆散數據。
Hbase目標在於依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。
Hbase 的基本概念
Row Key(主鍵)
表中行記錄的主鍵;
相當於我們常見的關係型數據庫中的主鍵,它是唯一的;在 HBase 中這個主鍵可以是任意的字符串,其最大長度是64K,在內部存儲中會被存儲爲字節數組,HBase 表中的數據是按照 RowKey 的字典序排列的。
Column Family(列族)
列族,表schema一部分,列的前綴;
由若干列構成,是表schema 的一部分,需要在創建表的時候指定好(修改列族,成本比較大,因此不建議更改)。可允許定義的列族個數最多爲20多個,列族可以幫我們構建數據的語義邊界,還能有助於我們設置某些特性,比如可以指定某個列族內數據的壓縮形式。一個列族包含的所有列在物理存儲上都是在同一個底層的存儲文件當中。
訪問控制、磁盤和內存的使用統計都是在列族層面進行的。實際應用中,列族上的控制權限能幫助我們管理不同類型的應用:我們允許一些應用可以添加新的基本數據、一些應用可以讀取基本數據並創建繼承的列族、一些應用則只允許瀏覽數據(甚至可能因爲隱私的原因不能瀏覽所有數據)。
Column(列)
列,屬於某個列族,可動態添加;
列的數量一般的沒有強限制的,一個列族當中可以有數百萬個列;
列名都以列族作爲前綴。例如 courses:history,courses:math 都屬於courses 這個列族。
Version Number(版本)
版本,默認是時間,降序排列;
每一列的值或是每個單元格的值都是具有版本號的,默認使用的系統當前的時間戳,精確到毫秒。
Cell(單元格)
單元格,由 row key , column , version 唯一確定,字節碼;
一個單元格就是由前面說的行鍵、列標示、版本號唯一來確定的;其中,列標示包括列族和列名。Cell 中的數據是沒有類型的,全部都是字節碼;
形式如: {row key, column(=<family> + <label>), version} 唯一確定的單元。
Region(區)
1.表在行的方向上分割爲多個region;
2.region按大小分割的,每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region。當table中的行不斷增多,就會有越來越多的region;
3.region是Hbase擴展和負載均衡的基本單元,不同的region分佈到不同的regionServer;
4.region是分佈式存儲的最小單元,但不是存儲的最小單元;
Hbase Table 中行的三種方式
1.通過單個 row key 訪問;
2.通過 row key 的 range ;
3.全表掃描。
時間戳
HBase中通過row和columns確定的爲一個存貯單元稱爲cell。每個 cell都保存着同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由hbase(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
爲了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,hbase提供了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
Hbase 的數據模型
HBase以表的形式存儲數據,表由行和列族組成,列劃分爲若干個列族(row family),其邏輯視圖如下:
Hbase 的特點
強一致性
同一行數據的讀寫只在同一臺region server上進行;
水平伸縮
region的自動分裂以及master的balance;
只用增加data node機器即可增加容量;
只用增加region server機器即可增加讀寫吞吐量;
行事務
同一行的列的寫入是原子的(即對行的操作要麼成功,要麼失敗);
大容量
一個表可以有上億行,上百萬列,數千個版本,TB 或 PB級的存儲;
面向列
面向列(族)的存儲和權限控制,列(族)獨立檢索。動態增加列;
稀疏
對於爲空(null)的列,並不佔用存儲空間,表可以設計的非常稀疏;
數據版本多
每個單元中的數據可以有多個版本;
數據類型單一
Hbase中的數據都是字符串,沒有其他類型;
實質上是一張極大的、非常稀疏的,存儲在分佈式文件系統上的表。
Hbase 的框架
Hbase 的集羣結構
集羣中幾個主要組件
客戶端庫(API) 、 一臺主服務器(Master) 、 多臺Region 服務器(RegionServer) 、 Zookeeper,具體模塊如下:
組件說明
1.客戶端庫, 可以通過 HBase 提供的各式語言API 庫訪問集羣。API 庫也會維護一個本地緩存來加快對 HBase 對訪問,比如緩存中記錄着 Region 的位置信息;
2.Maste 節點, 主要爲各個 RegionServer 分配 Region,負責 RegionServer 對負載均衡,管理用戶對於 Table 對 CRUD 操作;
3.RegionServer, 維護 Region,處理對這些 Region 對IO 請求,負責切分在運行過程中變過大的 Region;
4.Zookeeper 的作用是非常重要的。Zookeeper 保證了至少有一個 Master 處於運行狀態,同時Zookeeper 也負責 Region 和 Region Server 的註冊。
PS:Zookeeper發展到目前,已經成爲了分佈式大數據技術中容錯性的標準框架,幾乎所有的分佈式大數據相關的開源框架,都依賴於Zookeeper實現HA。
一個 HBase 集羣一般包括一個 Master 和多個 RegionServer 。