HBase框架

1. HBase有哪些基本的特徵?

HBase是類似於google的bigtable的開源實現,擁有以下特徵:

1). 在HDFS之上

2). 基於列存儲的分佈式數據庫

3). 用於實時地讀、寫大規模數據集

其他HBase的特性: 

1).沒有真正的索引,行順序存儲,也沒有所謂的索引膨脹問題。

2) 自動分區,表增長時,自動分區到新的節點上。

3) 線性擴展和區域會自動重新平衡,運行RegionServer,達到負載均衡的目的。

4).容錯和普通商用的硬件支持。這點同hadoop類似。


2. HBase相對於關係數據庫能解決的問題是什麼?

HBase與關係數據的區別?

其實就是關係數據庫與HBase各自的優缺點。

關係數據庫的缺憾:

1). 擴展困難

2). 維護複雜

HBase就是解決可伸縮行的問題。通過簡單增加節點來獲取線性擴展性。不支持SQL。

HBase與RDBMS的區別?

1). 表的設計:HBase的表可以很高,很寬,可伸縮性很強。而且表的模式是物理存儲的直接反映。

2). 拓撲: HBase能水平分區並在上千個節點上自動複製。

3). 應用形式: 開發者必須承擔更多的責任來正確地利用HBase的檢索和存儲方式。

4). RDBMS 遵循固定的模式,如“codd 12 規則”,強調事務的“強一致性”、參照完整性、SQL支持、數據的邏輯與物理形式相對獨立。等等。適用於中小規模的數據,但對於數據的規模和併發讀寫方面進行大規模擴展時,RDBMS會性能大大降低,分佈式更爲困難,因爲其需要放棄很多RDBMS的易用的特性。


HBase適用於上億、上千億級的數據,如果是隻有上千、上百萬級別是數據,傳統的RDBMS是更好的選擇。

HBase需要更多硬件,如果硬件較少,如5個,幹不成什麼好事。

如果從RDBMS移植到HBase,需要消除RDBMS的很多額外特性,如列數據類型、第二索引、事務、高級查詢等。


4. HBase的模式Schema設計的一些概念和原則

1)模式的創建與更新

可以使用HBase Shell或HBase Admin來創建和編輯HBase的模式。

在0.90.x 版本,只能先禁用表,再修改列族,而0.92.x版本以後,支持在線修改。


而且表和列族修改後,如size, region, block size等,在下次 主緊縮 或 存儲文件時 起作用。


2)列族的數量

-列族數量越少越好,即使同時有兩個列族,查詢的時候總是訪問其中一個列族,不會同時訪問。

-當一個表存在多個列族,當基數差距很大時,如A族有100萬行,B族10億行,A族可能會被分散到很多區域region,導致掃描A的效率降低。

-另外,多個列族在flush和compaction時,會造成很多I/O負擔。


3)行鍵設計RowKey

a. 不要將RowKey設計成有序的形式,因爲這樣容易阻塞並行性,將負載壓都在一臺機器上

b. 定位一個單元,需要行,列名和時間戳。如果一個單元格的座標很大,會佔用內存,索引用光。所以,解決方法:列族名儘量小,如一個字符a,短屬性名,而行鍵長度可讀即可(行鍵長度對數據訪問無太大影響),將數字字符轉換爲數字字節模式(節省空間)。

c. 倒序時間戳有助於找到找到最近版本值

d. 行鍵是在列族範圍內有效,不同列族中可以擁有同樣的行鍵

e. 行鍵永遠不能變


4)HBase支持所有能轉換爲字節數組的東西,如字符串、數字、複雜對象、計數器、甚至圖像。

5)列族可以設置存活時間TTL,超時後,HBase自動刪除數據

6)第二索引和查詢: 這裏面有很多東西,需要查看對應版本官方的文檔更好些。


5. HBase的拓撲結構是什麼?

1)拓撲結構: 類似於HDFS的mast與slave,mapreduce的tasktracker與jobtracker的關係,HBase也有master和RegionServer


2)HBase與ZooKeeper的關係是什麼?

HBase必須管理一個ZooKeeper實例,它依賴ZooKeeper,主要目的是,通過ZooKeeper來協調區域內的服務器,它負責目錄表、主控機地址等重要信息,若有服務器崩潰,HBase就可以通過ZooKeeper來協調分配。
RegionServer在HBase的配置文件conf/regionservers文件中,而HBase集羣的站點配置在conf/hbase-site.xml和conf/hbase-env.sh中配置。HBase儘量遵循了Hadoop的規則。


3)HBase的內部結構管理狀況:

其內部有-ROOT, -META的特殊目錄表,用於維護當前集羣上所有區域的列表、位置和狀態

-ROOT表包含 -META表的區域列表,而-META表示包含用戶的的區域列表。

所以,HBase管理的流程是: 

Client -- 鏈接到ZooKeeper -- 查找-ROOT表的位置 -- 查找-META表的位置 -- 查找用戶的區域所在的節點、位置及其狀態等 -- 直接管理指定區域的RegionServer並進行交互。


HBase支持Java及MapReduce的開發。

HBase提供了Thrift、REST及Avro的接口。HBase需要有一個相應的接口客戶端負責與這些接口的交互。但是這些需要代理進行處理請求和響應,所以比java更慢。

%hbase-daemon.sh start/stop rest/thrift/avro  //啓動或終止對應的客戶端


4)HBase的使用示例:

1. 創建表

如在外殼環境下: create ‘station’, {NAME => 'info', VERSION >= 1}

2. 加載數據

MapReduce 與 HBase可以充分利用集羣的分佈式模型,將原始數據複製到hdfs中。

每個任務只有一個HTable實例, 默認情況下,每個HTable.put(put),在執行插入操作時,不任何緩存。不過想使用緩存,是可以自己設置的。

3. Web查詢

可以直接使用HBase的java API來實現一個Web的應用。HTable.get()可用來獲取已定義的列族的所有內容。get的結果返回給Result, 包含的是數據行。

HBase還可以使用掃描器scanner來檢索觀測數據。並且獲取的是一個有序的結果。類似於傳統數據庫中的“遊標”。HTable.getScanner(scan).


3. HBase的數據模式是怎麼樣的?即有哪些元素?如何存儲?等

1). 數據模式

如下列三個表:

第一個是一個稀疏的表,實際上它是一個虛表,僅是一個概念視圖,不是真實的存儲形式,它來源於後兩個表。

而後兩個表纔是真正的表,物理視圖,他們是實際的存儲形式,而且它們是按列族進行存儲的。

Row Key Time Stamp ColumnFamily contents ColumnFamily anchor
"com.cnn.www" t9

anchor:cnnsi.com = "CNN"
"com.cnn.www" t8

anchor:my.look.ca = "CNN.com"
"com.cnn.www" t6 contents:html = "<html>..."

"com.cnn.www" t5 contents:html = "<html>..."

"com.cnn.www" t3 contents:html = "<html>..."


Row Key Time Stamp Column Family anchor
"com.cnn.www" t9 anchor:cnnsi.com = "CNN"
"com.cnn.www" t8 anchor:my.look.ca = "CNN.com"


Row Key Time Stamp ColumnFamily "contents:"
"com.cnn.www" t6 contents:html = "<html>..."
"com.cnn.www" t5 contents:html = "<html>..."
"com.cnn.www" t3 contents:html = "<html>..."


2). HBase的基本元素:

表、行、列、單元格: 表的基本要素

鍵:一般是指行的鍵,即唯一標識某行的元素。表中的行,可以根據鍵進行排序,而對錶的訪問,也通過鍵。

列族:所有列族成員擁有相同的前綴,某列族的成員,需要預先定義,但也可以直接進行追加。

列族成員會一起放進存儲器。而HBase面向列的存儲,是面向列族的數據存儲(這個通過上面那個表的示例可以看出來),數據存儲與調優都在這個層次,HBase表與RDBMS中表類似,行是排序的,客戶端可以把列添加到列族中去。

單元格cell: 單元格中存放的是不可分割的字節數組。並且每個單元格擁有版本信息。HBase的是按版本信息倒序排列。

區域region:將表水平劃分,是HBase集羣分佈數據的最小單位。在線的所有區域就構成了表的內容。

加鎖:對數據行進行更新,都需加鎖。保持原子性。


3) 數據模型有哪些操作?

Get、Scan、Put、Delete,即返回特定行的屬性,多行屬性、插入、刪除數據。

這些都需要一個HTable實例來操作。分別有Get、Scan、Put、Delete類來指定相應的參數、屬性。

以scan爲示例:


  1. HTable htable = ...      // instantiate HTable  
  2.       
  3. Scan scan = new Scan();  
  4. scan.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("attr"));  
  5. scan.setStartRow( Bytes.toBytes("row"));                   // start key is inclusive  
  6. scan.setStopRow( Bytes.toBytes("row" +  (char)0));  // stop key is exclusive  
  7. ResultScanner rs = htable.getScanner(scan);  
  8. try {  
  9.   for (Result r = rs.next(); r != null; r = rs.next()) {  
  10.   // process result...  
  11. finally {  
  12.   rs.close();  // always close the ResultScanner!  
  13. }  


4) 返回結果的排序方式是什麼?

先是行、再是列族、再是列修飾符,最後是時間戳(反向排序,最新的在前面)。


5)最後,HBase不支持聯合查詢


6)mapreduce與HBase表配合使用,默認mapreduce的任務分割是根據HBase表中region的多少來分割,一個region就有一個map。


6. HBase與Cassender的比較

不同的應用,應該選用不同的NoSQL數據庫,Cassandra, HBase, MongoDB, Riak都有各自的優缺點。
而且以上各種數據庫,都在發展中,隨着版本變換,特點也會發生變化。
 根據 CAP理論(Consistency一致性, Availability 可獲得性, Partitioning tolerance 分區容忍),二者可以簡單區分一下。

HBase是Hadoop生態系統的一部分,又其他框架如PIG, HIVE等的支持,而Cassender上運行mapreduce相對比較複雜的。總體上來說,Cassender或許在存儲上比較有效,但HBase的數據處理能力更強些。
HBase有Shell腳本和Web頁面的處理能力,而Cassender沒有Shell的支持,只有API,可用性上不如HBase。

Cassender的Schema發生變化時,需要集羣重啓,但Cassender宣稱“寫操作永不失敗”,而HBase是有可能的。
場景:Cassandra 對由高速光纖連接的小型數據中心(幾百個節點左右)是最佳的,而HBase適合網絡“緩慢”且不可預料的Internet網。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章