參考 http://hbase.apache.org/book.html#_architecturecss
HBase是一種"NoSQL"數據庫。「NoSQL」通常指的是非關係型數據庫,咱們知道,關係型數據庫支持SQL,也就是說HBase不支持SQL。非關係型數據庫有許多種,BerkeleyDB是一種本地非關係型數據庫,然而,HBase是分佈式數據庫。從技術上來說,HBase更像是「Data Store」,而不是「Data Base」,由於它缺乏許多關係型數據庫的特性,好比:列類型、輔助索引、觸發器、查詢語言等等。(PS:意思是,從技術的角度講,HBase更像一個數據存儲,而不像數據庫)html
HBase集羣擴展經過增長RegionServer來實現。若是一個集羣從10擴展到20個RegionServer,那麼,不只僅是存儲容量增長一倍,連處理能力也會增長一倍。對於關係型數據庫而言,也能夠用scale作到這樣,可是須要指出的是,這須要特別的硬件和存儲設備。HBase特性以下:web
並非全部的問題都適合用HBasesql
第1、確保你有足夠的數據。若是你有數以億計的數據行,那麼HBase是一個不錯的選擇。若是你只有數千或者百萬的數據,那麼使用傳統的關係型數據庫可能更好,由於事實上你的這些數據可能只須要一個或者兩個節點就能處理得完,這樣的話集羣中的其它的節點就處於空閒狀態。數據庫
第2、確保你不須要用到關係型數據庫的特性(好比:固定類型的列、輔助索引、事務、查詢語言等等)。基於關係型數據庫構建的應用不能經過簡單的改變JDBC驅動來傳輸到HBase中。從RDBMS到HBase是徹底相反的兩套設計。apache
第3、確保你有足夠的硬件。由於當DataNode數量小於5的時候HDFS將不能正常工做了。編程
HDFS是一個分佈式的文件系統,適合存儲大文件,但它不能提供快速的個性化的在文件中查找。HBase是構建於HDFS基礎之上的,而且它支持對大表的中的記錄進行快速查找和更新。HBase內部將數據存放在HDFS中被索引的「StoreFiles」上以供快速查找。api
HMaster是Master Server的一個實現。Master Server負責監視集羣中全部的RegionServer實例,而且它也是全部元數據改變的一個對外接口。在分佈式集羣中,典型的Master運行在NameNode那臺機器上。緩存
HMasterInterface接口是操做元數據的主要接口,提供如下操做:app
HRegionServer是RegionServer的實現,它負責服務並管理regions。在分佈式集羣中,一個RegionServer一般運行在一個DataNode上。
HRegionRegionInterface既包含數據的操做也包含region維護的操做
region server處理寫請求,它們被累積在內存中一個叫memstore的地方。一旦memstore文件滿了,內容將被寫到磁盤上做爲store file。這個事件叫作memstore flush。隨着store file的不斷累積,RegionServer將合併它們成大文件,以減小store file的數量。在每次刷新或者合併之後,region中數據的數量會發生改變。RegionServer根據切分策略來查看是否region太大了或者應該被切分。
邏輯上,region切分的操做很簡單。找一個合適的位置,將region中的數據切分紅兩個新的region。然而,這個處理的過程並不簡單。當切分發生的時候,數據並非馬上被重寫到這個心建立的女兒region上。
在HBase中,數據被存儲在表中,有行和列。這些術語和關係型數據有一些重疊,固然這不是一個很好的類比,可是它對咱們思考HBase的表示一個多維的map頗有幫助。
Table
由多行組成
Row
HBase中的行由一個row key和一個或多個列組成。Rows在存儲的時候按照row key的字典序存儲。正由於如此,row key的設計就顯得很是重要。基於這一點,相關連的行相互之間存在附近。一般,row key是一個網站的域名。若是你的row key是域名,你應該以倒置的方式存儲它們(好比:org.apache.www,org.apache.mail,org.apache.jira等等)。這樣的話,全部的apache域名在表中是相近的位置,而不是被子域名的第一部分分開。
Column
HBase中的列由一個列簇和一個列修飾符組成,它們之間用冒號分隔(:)
Column Family
列簇由一系列的列和它們的值組成,這是基於性能考慮的。每個列簇都有一系列的存儲屬性,好比:是否它們的值應該被緩存到內存中,它們的數據怎樣被壓縮,它們的row key怎樣被編碼,等等。表中的每一行都有相同的列簇,即便一個給定的行在給定的列簇上沒有存儲任何數據。
Column Qualifier
一個列修飾符被添加到列簇中爲了給指定的數據片斷提供索引。假設,給定的列簇是content,那麼,一個列修飾符多是content:html,其它的還有多是content:pdf。雖然,列簇在表建立的時候就固定了,可是列修飾符是不肯定的,並且不一樣的行可能有不通的列修飾符。
Cell
Timestamp
一個timestamp被寫在每一個value的旁邊,它是一個value的版本修飾符。默認的,timestamp表明數據被RegionServer寫入的時間,你也能夠在寫數據的時候指定一個不一樣的timestamp值
在這個例子中,有一個表叫「webtable」,它包含兩行數據(com.cnn.www和com.example.www)和三個列簇(contents,anchor,people)。對於第一行(com.cnn.www),anchor包含兩列(anchor:cssnsi.com,anchor:my.look.ca),contents包含一列(contents:html)。row key爲「com.cnn.www」的行有5個版本,而row key爲「com.example.www」的行有1個版本。contents:html列包含整個網站的HTML。
在這個表格中的空的單元格並不佔用空間
下圖是一個模擬,目的在於解釋說明上面咱們所說的,便於咱們理解:
雖然,在概念上,表看起來像是一行一行的,但物理上,它們是按照列簇被存儲的。一個新的列修飾符能夠在任意時刻被添加到列簇中。
在前面的概念視圖中的空的單元格是不被存儲的。所以,請求contents:html列而且timestamp爲t8將返回沒有值。然而,若是不指定timestamp,那麼某個列的大部分值都會被返回。若是指定多個版本,只有找到的第一個會被返回,由於數據是按照timestamp降序存儲的。
一個命名空間是表的一個邏輯分組
行按照row key字典升序存儲
Columns in Apache HBase are grouped into column families.
列簇中全部的列成員都有相同的前綴。例如,列courses:history和courses:math都是courses這個列簇的成員。用冒號分隔列簇和列修飾符。列簇前綴必須由能夠打印輸出的字符組成。列修飾符能夠由任意字節組成。列簇必須在表被定義的時候就聲明好,所以列就不須要在表建立的時候定義了,而且能夠隨時新增。
物理上,全部的列簇成員被存儲在一塊兒。
A {row, column, version} tuple exactly specifies a cell
in HBase.
數據模型有4個主要操做,分別是Get、Put、Scan和Delete。這些操做是應用在表上的。
返回指定行的屬性
添加新的行到表中,或者更新已經存在的行
掃描特定屬性的多行
從表中刪除一行
在HBase中,{row,column,version}能夠肯定一個單元格。當行和列被壓縮成字節的時候,版本用long類型指定。在HBase中,版本以降序存儲,因此,最近的值老是最早被發現。
對於全部的數據模型操做,HBase以數據被存儲時的順序返回。首先按行排序,其次按列簇,再其次按列修飾符,最後是timestamp。(PS:前是三個是字典升序,最後一個timestamp是降序)
不存儲列的元數據,所以,HBase能夠支持每一行有許多列,行與行之間能夠有多種不一樣的列。
HBase不直接join操做,至少不支持關係型數據庫那種join。在HBase中,讀取數據經過Get和Scan。
HBase能夠做爲MapReduce做業的數據源。對於讀寫HBase的MapReduce做業,建議使用TableMapper和TableReducer。
若是你運行HBase做爲數據源的MapReduce做業,你須要在配置文件中指定表和列名。
當你從HBase讀取數據的時候,TableInputFormat請求regions的列表而且做爲一個map。