一、什么是HBase?特性
HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),基于Hadoop,建立在HDFS上。HBase是為了解決HDFS上能存結(jié)構(gòu)化的數(shù)據(jù)卻不能處理這些數(shù)據(jù)的情況,實際上就是實現(xiàn)了HDFS的隨機讀寫,比如當刪除一個數(shù)據(jù)是對數(shù)據(jù)做一個標記,并未真正刪除,當然用戶就看不到被標記的數(shù)據(jù),真正刪除的時候是在合并文件的時候才識別刪除標記把數(shù)據(jù)刪除掉。

- 海量存儲
適合用來存儲PB級別的海量數(shù)據(jù) - 列式存儲
指的是列族存儲,列族下面可以有很多個列,列就相當于數(shù)據(jù),列族在創(chuàng)建HBase表的時候就要指定好 - 方便擴展
由于是基于Hadoop建立在HDFS上,那么數(shù)據(jù)也是就跟之前提到的HDFS存儲數(shù)據(jù)特點一樣,多份存儲,還支持橫向擴展,擴展性體現(xiàn)在2個方面:一個是基于上層業(yè)務處理能力(RegionServer)的擴展,一個是基于存儲能力(HDFS)的擴展。 -
稀疏性,一般數(shù)據(jù)庫都是一行數(shù)據(jù)中如果某一列沒數(shù)據(jù)就是賦值為null,然而HBase則是一行中某一列沒數(shù)據(jù)就沒數(shù)據(jù),沒有說賦值為null的說法。這樣數(shù)據(jù)看起來就不是像傳統(tǒng)數(shù)據(jù)庫展示的那樣整整齊齊了。對于傳統(tǒng)數(shù)據(jù)庫,插入列和刪除列對整個數(shù)據(jù)庫的改動是很大的,但對于非關(guān)系型數(shù)據(jù)庫,插入列和刪除列跟插入記錄和刪除記錄類似。image.png
二、HBase架構(gòu)解析

一個HRegion大致可以當成一張表來看待,一個Store大致可以當成一個列族來看待,當表數(shù)據(jù)量很大的時候,會按數(shù)據(jù)把HRegion進行切分分配給不同的HRegionServer。使用HBase時需要有HDFS和ZK,就要啟動hadoop和zookeeper組件。
-
HRegion:HBase表的分片,是HBase分布式存儲和負載均衡的最小單元,同一個Region只能拆分到同一個RegionServer里,不同的Region可以拆分到不同的RegionServer中。關(guān)于拆分操作,HBase是以Store的大小來判斷是否拆分Region。 -
HLog:修改記錄日志 -
Mem Store:內(nèi)存存儲,達到一定閾值時會flush到文件中 -
Store File:對應一個列族,實際存儲文件 -
HFile:文件存儲格式,存儲在Store File中,是不定長的,固定的長度有Trailer和FileInfo這2塊,Trailer指針指向其他數(shù)據(jù)塊的起始點,F(xiàn)ileInfo記錄著文件的一些meta信息。
hbase的邏輯結(jié)構(gòu)
有store實際存儲的,列族其實就是多個列的分類,每一條記錄都有一個rowkey,是唯一的,region相當于是表的切片,分塊切分存儲
hbase的物理結(jié)構(gòu)
hbase如何實現(xiàn)在hdfs上隨機讀寫,快速寫呢,當修改操作時實際上也是新增一條最新的記錄,當時間戳大于舊數(shù)據(jù)時間戳的話,則返回時間戳大的那條記錄;當刪除操作時實際上是把那條記錄打個標記,類型改為Delete,則不返回這條記錄,但這條件記錄還是存在的
hbase基礎架構(gòu)
Master管DML操作,對數(shù)據(jù)做get、put、delete操作,Region Server管DDL操作,對表做create、delete、alter操作
其中各組件在HBase中的作用
-
zookeeper
作為Master的的高可用,負責RegionServer的監(jiān)控,當RegionServer有異常時,會通過回調(diào)的形式通知master情況。
作為元數(shù)據(jù)的入口,以便客戶端查找某個數(shù)據(jù),而且負責集群配置的維護工作,比如通過zookeeper來保證集群只有一個master運行,當master掛了,會通過競爭機制來產(chǎn)生新的master提供服務。 -
HMaster
給RegionServer分配Region
維護整個集群的負載均衡
維護集群的元數(shù)據(jù)信息
當Region失效了,會把Region分配給正常的RegionServer,當RegionServer失效時,會把Region和HLog給其他正常的RegionServer。注意:當RegionServer掛了并不代表數(shù)據(jù)就沒了,數(shù)據(jù)是存在HDFS的,只要從HDFS再把數(shù)據(jù)拿出來就好。 -
HRegionServer
它是真正“干活”的節(jié)點,直接對接讀寫請求
管理著master為其分配的Region
處理來自客戶端的讀寫請求
負責和HDFS進行交互,存儲數(shù)據(jù)到HDFS
負責Region的拆分工作和Storefile的合并工作 -
HDFS
提供元數(shù)據(jù)和表數(shù)據(jù)的底層分布式存儲服務
三、HBase數(shù)據(jù)結(jié)構(gòu)
RowKey
相當于mysql數(shù)據(jù)庫的主鍵,全局唯一的,用來檢索記錄,一般來說設計rowkey長度在70~100字節(jié)就足夠滿足需求了,在HBase中保存為字節(jié)數(shù)組,注意:HBase中的數(shù)據(jù)類型只有字節(jié)數(shù)組,但提供了一個HBaseUtils工具類幫助我們轉(zhuǎn)換為我們需要的數(shù)據(jù)類型比如String等等。數(shù)據(jù)按照rowkey的字典序排序存儲,在設計rowkey時要盡量將經(jīng)常一起讀寫的行存儲在一起(位置相關(guān)性)。
訪問rowkey的3種方式:
①通過單個rowkey訪問
②通過rowkey的正則
③全表掃描Region
相當于mysql中的數(shù)據(jù)表,hbase創(chuàng)建表時只需要表名和列族即可,不需要聲明表字段,這就意味著往hbase寫入數(shù)據(jù)時,字段可以動態(tài)的指定,比mysql數(shù)據(jù)庫相比起來就很靈活了。Row
hbase表的每行數(shù)據(jù)都是由一個RowKey和多個Column組成,hbase數(shù)據(jù)是有按照字典序順序存儲的,而且在查詢檢索數(shù)據(jù)時必定要指定rowkey,所以優(yōu)良的設計rowkey就顯得十分重要了。Column Family
指的是列族,在創(chuàng)建表的時候就要指定,可以多個,列不能脫離列族而存在,列名都以列族作為前綴。Time Stamp
時間戳,用于標識數(shù)據(jù)的版本,每天數(shù)據(jù)寫入時如果不指定時間戳,則系統(tǒng)會按照寫入hbase的時間把該條數(shù)據(jù)的這個timestamp填充上,這個timestamp很重要,決定該條數(shù)據(jù)是否是最新的namespace
相當于mysql中的數(shù)據(jù)庫名,hbase默認提供了2個Name Space,一個是hbase,用來存放hbase內(nèi)置的表;一個是default,用來提供給用戶的表存放。Cell
由{rowkey,列族,列限定符,timestamp}組成的唯一單元,cell中的數(shù)據(jù)是沒有數(shù)據(jù)類型的,都是統(tǒng)一的字節(jié)碼存儲,不過hbase提供了一個工具類幫助字節(jié)數(shù)組轉(zhuǎn)換成一些復雜的數(shù)據(jù)類型。
四、HBase讀寫原理
新版和舊版有區(qū)別,0.98版本前還有一張-ROOT-表,所以讀步驟就加多一步,就是在尋找meta表前先去找-ROOT-表,從-ROOT-表獲取meta表的位置。還有hbase讀操作比寫操作反而慢。
-
讀流程
client先請求zookeeper集群獲得hbase的meta表的存儲位置,然后就去找meta表,meta表里存的是數(shù)據(jù)被分配在哪一個RegionServer中,然后再去對應的RegionServer找數(shù)據(jù),讀的時候是先讀內(nèi)存Mem Store中的數(shù)據(jù),因為在這里的數(shù)據(jù)是最新的,沒有才去硬盤讀。讀流程.png -
寫流程
cilent先請求zookeeper集群獲得hbase的meta表的存儲位置,然后去找對應的RegionServer中的meta表,返回meta表數(shù)據(jù),之后發(fā)送寫入數(shù)據(jù)請求,寫入操作是先寫入編譯日志HLog中,再寫入內(nèi)存Mem Store中,最后反饋寫入成功。三個條件會觸發(fā)flush操作把數(shù)據(jù)從內(nèi)存寫入到HDFS寫流程.png
不過以下這些條件是可以通過配置文件hbase-default.xml來配置修改的 - 當一個HRegionServer里所有的Mem Store加起來達到這個堆內(nèi)存的40%時,觸發(fā)flush操作
- 當一個Mem Store的數(shù)據(jù)超過1小時的時候觸發(fā)flush操作
- 當一個HRegion中的所有Mem Store加起來的數(shù)據(jù)超過128m的時候觸發(fā)flush操作
還可以配置compact操作,當達到多少個小文件時或者達到多少天時就進行合并成一個新的大文件。合并是Store級別的列族合并。
附學習文章:
1、為什么出現(xiàn)了HBase?
2、一圖了解HBase
3、hbase中storefile、hfile、store、region的關(guān)系


