一.HBase特點:
1.弱視圖,HBase是一種高效的映射嵌套,用戶可以在運行時定義列,每一行都有屬于自己的列。
2.非標準化數據。
二.HBase表組成
1.行健,按字典順序存儲。
2.列簇,一組列的集合
3.單元格,列和行的交集是一個單元格,單元格是版本化的(默認使用時間戳),最新的版本在最前邊,默認保三個版本。單元格中的數據以二進制字節數組存儲。
三.列簇
1.列簇必須在創建表的時候定義。
2.每個列簇中的列數是沒有限制的。
3.同一列簇下的所有列會保存在一起。一個HFile文件保存一個列簇的數據。
4.列在列簇中是有序的,按照字典順序排列。
5.列可以在運行時動態創建。
6.列只有在插入數據后才會存在,空值不保存,不占存儲空間。
四.HBase存儲設置
1.壓縮格式,默認無壓縮,可以使用GZ、LZO、SNAPPY
2.HBase默認塊大小是64K,不是64兆,因為HBase需要支持隨機訪問,一旦在查詢的時候找到行健所在的塊,就會對應塊的單元格數據取出,對64k大小的塊進行掃描的速度明顯快與64M。
3.內存模型:默認false,如果設置為true,HBase會嘗試將整個列簇保存在內存中。
4.塊緩存,默認true,HBase使用塊緩存將最近使用的塊加載到內存中。塊緩存使用最近沒有使用(LRU)的原則刪除塊數據。
5.布隆過濾,是一種空間高效的數據結構,可以設置為ROW,使用行級的布隆過濾,ROWCOL使用行健與列標識級別的布隆過濾。
五.HBase組件
架構圖(官方圖)
1.Zookeeper
主要職責:支持遠程組件之間的松散耦合消息機制,組件之間通過心跳機制協調他們的狀態和健康信息。
2.Master
集群環境中可以同時存在多個主節點,但是同一時間只有一個扮演主節點的角色,其他節點作為備用節點,如果主節點與zk的租約過期,剩下的備用節點重新發起競爭,由zk選舉主節點。
功能:執行集群管理操作,跟蹤數據位于哪個節點上(行健鑒別),控制負載均衡和故障切換,主節點不直接獲取RegionServer信息,通過zk獲取各RegionServer運行狀態。
3.RegionServer(分區服務器)
主要負責管理多個分區,數據實際存儲在分區中,每一個RegionServer有一個WAL文件(預寫日志)和塊緩存,預寫日志文件存儲在hdfs,防止丟失。該RegionServer上的所有分區共享WAL和塊緩存.
4.WAL
功能:確保數據不丟失,如果發生故障,可以使用WAL恢復數據。
WAL中保存了分區服務器還沒有寫入HFile的所有操作。寫入WAL之后再寫入MemStore,當MemStore的大小達到預設的值時,將數據寫入HFile固化到磁盤。如果想提高寫入性能可以關閉WAL,但是會有數據丟失的風險。
5.塊緩存
是一種內存結構,遵循LRU(最近沒有使用)回收規則,默認對表是開啟的。通過SCAN和GET獲取的數據都會加載到緩存。0.96版本之后支持使用JAVA NIO實現的堆外緩存,這個優化大大減小了RegionServer的GC壓力。
6.分區
一個RegionServer上有多個分區,每一個分區對應一張表,管理表中一定范圍行健內的行數據,分區的行健范圍不必是連續的,分區對于表中不同列簇是分開存儲的,一個HFile存儲一個列簇的數據。
7.MemStore
當HBase有更新操作時,先寫入WAL再寫入MemStore(內存結構),預定義MemStore大小配置hbase.hregion.memstore.flush.size。每一次持久化操作都會針對分區中的每一個列簇創建一個HFile文件,當用戶讀取數據時先從MemStore中讀取數據,如果沒有在MemStore中找到對應的值才會嘗試從HFile文件中讀取。
注意:MemStore的持久化過程是阻塞的,此時不能提供服務。
早期的MemStore使用堆內存實現,會產生大量的堆內存碎片,并導致周期行的FullGC,FullGC會導致程序暫停。
8.HFile文件
最終保存HBase數據的文件(存儲于HDFS),一個HFile文件屬于一張表的一個列簇,數據以行健和列的字典順序排列,同時單元格內的數據是以版本號降序排列。多個RegionServer的MemStore多次持久化的HFile文件,他們之間是無序的,HBase會通過部分壓縮和全量壓縮進行合并。當HFile文件的數量達到一定的閾值,就會啟動部分壓縮,將多個HFile文件合并為一個大的HFile文件。全量壓縮會在每天的固定時間段進行(系統活躍度低的時間)。合并的過程會對數據重新排序,保證合并后的文件數據依然是有序的。
9.兩個重要的表-Root-.META.
-Root-保存.META.的路徑,它指向.META.在集群的哪個節點上。是唯一不會被拆分的表。
.META.保存集群中每個分區的元數據,關鍵的類HRegionInfo,包括表的信息,表的起始行健值和終止行健值。
六.客戶端與HBase建立連接的過程
A.Client與ZK集群建立連接,從ZK集群獲取-Root-表位置信息。
B.Client連接-Root-表,并得到.META.表的位置信息。
C.Client連接.META.表并下載分區列表和他們的位置。
D.Client使用從.META.表下載的信息直接連接RegionServer中的分區操作數據,在這過程中Clien會進行一系列的查詢操作。
E.Client會將-Root- .META.周期性的下載到本地,當Client連接RegionServer后發現.META.表提供的行健范圍不在分區中才會重新刷新本地目錄表緩存。
七.分區與壓縮
如果在創建表是沒有設置預分區,剛創建表時只有一個分區,直到該分區的大小達到habse.hregion.max.filesize屬性值時默認10G,該分區會再次分區,注意此時的分區是邏輯分區,只記錄分區的行健。分區大小會繼續增長,只有在全量壓縮的時候才會把邏輯分區轉為物理分區,將原始數據文件拆開到其他分區HDFS路徑下的不同文件中。原始分區將在物理上分成兩個分區,并且這兩個分區屬于不同的兩臺RegionServer。
壓縮是分區中HFile文件合并的過程,減少HFile的數量能夠提高HBase的性能。因為能夠減少scan和get讀取的文件數。壓縮分兩種:部分和全量。
部分壓縮,會把多個HFile文件壓縮成一個,部分壓縮的過程,Client仍然可以向MemStore寫數據,但是不執行MemStore的持久化,如果MemStore被寫滿,此時暫停對外服務,與該分區交互的Client處于阻塞狀態,直到壓縮過程執行完畢,恢復操作。
全量壓縮,將一個分區內所有的HFile文件合并成一個文件,在這個過程所有的刪除操作和版本過期的單元格都會被移除。全量壓縮默認每天執行一次。(提示:HBase的刪除操作并不會在執行完刪除命令后就立即刪除數據,而是先給該數據打上被刪除的標簽,在全量壓縮的過程中才會被真正的刪除)