一、Hbase介紹:
(HBase的默認端口號:60010)
一個分布式、可擴展的支持海量數據存儲的NoSQL數據庫,基於HDFS分布式文件系統,利用zookeeper作為協同服務去構建的。他的數據是存儲在HDFS之上。主要用來存儲非結構化和半結構化的松散數據。(所以啟動的時候先啟動HDFS和zookeeper)
一個列簇包含有多個列(一個H表中盡量少的設計列簇,而列可以隨意多)。
真正往HDFS上存儲的就是store的內容。
Region就是表的切片,一個表被分成多個Region。
特點:
1.低成本;
2.高並發的隨機寫;
3.支持實時查詢;
4.存儲海量數據;(上億行,上百萬列)
5.數據的“結構”非常靈活;
6.面向列(簇)的存儲和權限控制,獨立檢索(僅能通過主鍵(row key)和主鍵的range來檢索數據)
7.表設計稀疏:值為空的列不占空間
學習HBase最好不要用RDBMS類型來理解,Hbase是面向列(實際上是列簇),而傳統的關系型數據庫是面向行存儲的。
二、Hbase入門:
首先來理解幾個概念:
1.Row Key:行鍵
用來檢索記錄的主鍵。
訪問Hbase table中的行,只有三種形式:
A、通過單個row key訪問
B、通過row key 的range
C、全表掃描
行鍵 (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,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行鍵必須用0作左填充。
2、Columns Family:列簇
Hbase表中的每個列,都屬於某個列簇,一個列簇可包含多個列。列名都以列簇為前綴。例如:student : name , student : age 這兩個列,都屬於student這個列簇。
3、Time Stamp:時間戳
Hbase中通過rowkey和columns確定的為一個存儲單元稱為cell。每個cell都保存着同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是64位整型。時間戳可以由
Hbase(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯示賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。
每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的管理(包括存儲和索引)負擔,Hbase提供了兩種數據版本回收方式。一是保存數據的最后n個版本,而是保存最近一段時間內的版本(比如最近7天)。用戶可以針對每個列簇進行設置。
4、Cell:單元
由{row key,columnFamily,version} 唯一確定的單元。cell中的數據是沒有類型的,全部是字節碼形式存儲。(hbase底層就是字節數組)。
三、Hbase架構
系統架構圖:
Hbase中的角色:
1. 一個或者多個(高可用)主節點:Hmaster
Hmaster可以有多個,通過zookeeper的Master Election機制,活躍狀態的只有一個。
主要負責Table和Region的管理工作:
-
- 管理用戶對表的增刪改查操作(注意是對表!!!DDL!!!不是對表數據DML!!!)
- 管理HRegionServer的負載均衡,調整Region分布
- Region Split后,負責新Region的分布
- 在HRegionServer停機后,負責失效HRegionServer上Region遷移
2. Hbase依賴項:zookeeper
Zookeeper Quorum 存儲-ROOT-表地址、Hmaster地址。
客戶端首先聯系ZooKeeper子集群(quorum)(一個由ZooKeeper節點組成的單獨集群)查找行健。上述過程是通過ZooKeeper獲取含有-ROOT-的region服務器名(主機名)來完成的。通過含有-ROOT-的region服務器可以查詢到含有.META.表中對應的region服務器名,其中包含請求的行健信息。這兩處的主要內容都被緩存下來了,並且都只查詢一次。最終,通過查詢.META服務器來獲取客戶端查詢的行健數據所在region的服務器名。一旦知道了數據的實際位置,即region的位置,HBase會緩存這次查詢的信息,同時直接聯系管理實際數據的HRegionServer。所以,之后客戶端可以通過緩存信息很好地定位所需的數據位置,而不用再次查找.META.表。
以上也正是Hbase雖然基於HDFS但任然高效的原因所在。
3.多個從節點:HregionServer
Hbase中核心部分,主要負責響應客戶端的I/O請求,向HDFS系統進行讀寫。負責管理Region對象。它是對表的數據進行增刪改查DML,注意區分開他和Hmaster的分工。
4.Hregion:
Hbase表中行的方向上分隔為多個Hregion。不同的Hregion可以分布在不同的HregionServer上,但同一個Hregion只能放在一個HregionServer上。
Hregion按照大小進行分隔,一個表初始只有一個region,隨着數據不斷增加,region也在不斷擴大,當達到某一個閾值(默認128M,有些地方說256M,有待考察。。。) 時就會隨分成2個region。Split
每一個Region由以下兩部分確定:
1.表名+startRowKey+創建時間
2.由目錄表(-ROOT-和.META.)記錄該region的endRowKey。
那么我們如何定位Hregion?====>三層結構:
-
- 通過zookeeper里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個region。
- 通過-ROOT-表查找.META.表的第一個表中相應的region的位置。.META.表中的每一個region在-ROOT-表中都是一行記錄。
- 通過.META.表找到所要的用戶表region的位置。用戶表中的每個region在.META表中都是一行記錄。
以上三層結構就像一個分布式的B+樹,-ROOT-永遠只有一個region,他是根。
Table和Hregion的關系:
table默認最初只有一個region,隨着記錄數的不斷增加而變大,起初的region會逐漸分裂成多個region,一個region由【startKey, endKey】表示,不同的region會被master分配給相應的regionserver管理。region是hbase分布式存儲和負載均衡的最小單元,不同的region分到不同的regionServer。region雖然是分布式存儲的最小單元,但並不是存儲的最小單元。region是由一個或者多個store組成的,每個store就是一個column family。每個store又由memStore和1至多個store file 組成(memstore到一個閥值會刷新,寫入到storefile,有hlog來保證數據的安全性,一個regionServer有且只有一個hlog)。
5.Hstore:
HBase存儲的核心。由MemStore和StoreFile組成。存儲的其實就是我們的列簇。
6.Hlog:
在分布式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種情況。
總結下:
HMaster管理的是對庫、表的操作(DDL),HRegionServer管理的是對表里數據的操作(DML);
HMaster還負責管理Hregion具體往那個HRegionServer上分布(負載均衡);
HregionServer管理着Hregion和Hlog;
Hregion其實就是表中的多行數據(整行),他包含Store和MemStore;
Store中其實存儲的就是列簇;
Hlog里記錄的是你的數據的操作,因為一切操作在內存上完成,假如內存崩掉,數據
就會丟失,這時Hlog記錄了你的操作,他會進行落盤。
下篇討論Hbase的讀寫流程。