客戶端并不依賴Master,而是通過(guò)Zookeeper來(lái)獲得Region位置信息,大多數(shù)客戶端甚至從來(lái)不和Master通信,這種設(shè)計(jì)方式使得Master負(fù)載很小
2、Region
開始只有一個(gè)Region,后來(lái)不斷分裂
Region拆分操作非常快,接近瞬間,因?yàn)椴鸱种蟮?/span>Region讀取的仍然是原存儲(chǔ)文件,直到“合并”過(guò)程把存儲(chǔ)文件異步地寫到獨(dú)立的文件之后,才會(huì)讀取新文件
同一個(gè)Region不會(huì)被分拆到多個(gè)Region服務(wù)器
每個(gè)Region服務(wù)器存儲(chǔ)10-1000個(gè)Region
元數(shù)據(jù)表,又名.META.表,存儲(chǔ)了Region和Region服務(wù)器的映射關(guān)系
當(dāng)HBase表很大時(shí), .META.表也會(huì)被分裂成多個(gè)Region
根數(shù)據(jù)表,又名-ROOT-表,記錄所有元數(shù)據(jù)的具體位置
-ROOT-表只有唯一一個(gè)Region,名字是在程序中被寫死的
Zookeeper文件記錄了-ROOT-表的位置
客戶端訪問(wèn)數(shù)據(jù)時(shí)的“三級(jí)尋址”
為了加速尋址,客戶端會(huì)緩存位置信息,同時(shí),需要解決緩存失效問(wèn)題
尋址過(guò)程客戶端只需要詢問(wèn)Zookeeper服務(wù)器,不需要連接Master服務(wù)器
3、HBase的三層結(jié)構(gòu)中各層次的名稱和作用
層次 |
名稱 |
作用 |
第一層 |
Zookeper文件 |
記錄了-ROOT-表的位置信息 |
第二層 |
-ROOT-表 |
記錄了.META.表的Region位置信息
-ROOT-表只能有一個(gè)Region。通過(guò)-ROOT-表,就可以訪問(wèn).META.表中的數(shù)據(jù) |
第三層 |
.META.表 |
記錄了用戶數(shù)據(jù)表的Region位置信息,.META.表可以有多個(gè)Region,保存了HBase中所有用戶數(shù)據(jù)表的Region位置信息 |
四、HBase運(yùn)行機(jī)制
1、HBase系統(tǒng)架構(gòu)

(1、客戶端包含訪問(wèn)HBase的接口,同時(shí)在緩存中維護(hù)著已經(jīng)訪問(wèn)過(guò)的Region位置信息,用來(lái)加快后續(xù)數(shù)據(jù)訪問(wèn)過(guò)程
(2、Zookeeper可以幫助選舉出一個(gè)Master作為集群的總管,并保證在任何時(shí)刻總有唯一一個(gè)Master在運(yùn)行,這就避免了Master的“單點(diǎn)失效”問(wèn)題
(Zookeeper是一個(gè)很好的集群管理工具,被大量用于分布式計(jì)算,提供配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。)

(3. Master
主服務(wù)器Master主要負(fù)責(zé)表和Region的管理工作:
管理用戶對(duì)表的增加、刪除、修改、查詢等操作
實(shí)現(xiàn)不同Region服務(wù)器之間的負(fù)載均衡
在Region分裂或合并后,負(fù)責(zé)重新調(diào)整Region的分布
對(duì)發(fā)生故障失效的Region服務(wù)器上的Region進(jìn)行遷移
(4. Region服務(wù)器
Region服務(wù)器是HBase中最核心的模塊,負(fù)責(zé)維護(hù)分配給自己的Region,并響應(yīng)用戶的讀寫請(qǐng)求
2、Region

(1、用戶讀寫數(shù)據(jù)過(guò)程
用戶寫入數(shù)據(jù)時(shí),被分配到相應(yīng)Region服務(wù)器去執(zhí)行
用戶數(shù)據(jù)首先被寫入到MemStore和Hlog中
只有當(dāng)操作寫入Hlog之后,commit()調(diào)用才會(huì)將其返回給客戶端
當(dāng)用戶讀取數(shù)據(jù)時(shí),Region服務(wù)器會(huì)首先訪問(wèn)MemStore緩存,如果找不到,再去磁盤上面的StoreFile中尋找
(2、緩存的刷新
系統(tǒng)會(huì)周期性地把MemStore緩存里的內(nèi)容刷寫到磁盤的StoreFile文件中,清空緩存,并在Hlog里面寫入一個(gè)標(biāo)記、
每次刷寫都生成一個(gè)新的StoreFile文件,因此,每個(gè)Store包含多個(gè)StoreFile文件
每個(gè)Region服務(wù)器都有一個(gè)自己的HLog文件,每次啟動(dòng)都檢查該文件,確認(rèn)最近一次執(zhí)行緩存刷新操作之后是否發(fā)生新的寫入操作;如果發(fā)現(xiàn)更新,則先寫入MemStore,再刷寫到StoreFile,最后刪除舊的Hlog文件,開始為用戶提供服務(wù)
(3、StroreFile的合并
每次刷寫都生成一個(gè)新的StoreFile,數(shù)量太多,影響查找速度
調(diào)用Store.compact()把多個(gè)合并成一個(gè)
合并操作比較耗費(fèi)資源,只有數(shù)量達(dá)到一個(gè)閾值才啟動(dòng)合并
3、Store工作原理
Store是Region服務(wù)器的核心
多個(gè)StoreFile合并成一個(gè)
觸發(fā)分裂操作,1個(gè)父Region被分裂成兩個(gè)子Region
單個(gè)StoreFile過(guò)大時(shí),又4、HLog工作原理
分布式環(huán)境必須要考慮系統(tǒng)出錯(cuò)。HBase采用HLog保證系統(tǒng)恢復(fù)
HBase系統(tǒng)為每個(gè)Region服務(wù)器配置了一個(gè)HLog文件,它是一種預(yù)寫式日志(WriteAhead Log)
用戶更新數(shù)據(jù)必須首先寫入日志后,才能寫入MemStore緩存,并且,直到MemStore緩存內(nèi)容對(duì)應(yīng)的日志已經(jīng)寫入磁盤,該緩存內(nèi)容才能被刷寫到磁盤
Zookeeper會(huì)實(shí)時(shí)監(jiān)測(cè)每個(gè)Region服務(wù)器的狀態(tài),當(dāng)某個(gè)Region服務(wù)器發(fā)生故障時(shí),Zookeeper會(huì)通知Master
Master首先會(huì)處理該故障Region服務(wù)器上面遺留的HLog文件,這個(gè)遺留的HLog文件中包含了來(lái)自多個(gè)Region對(duì)象的日志記錄
系統(tǒng)會(huì)根據(jù)每條日志記錄所屬的Region對(duì)象對(duì)HLog數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)Region對(duì)象的目錄下,然后,再將失效的Region重新分配到可用的Region服務(wù)器中,并把與該Region對(duì)象相關(guān)的HLog日志記錄也發(fā)送給相應(yīng)的Region服務(wù)器
Region服務(wù)器領(lǐng)取到分配給自己的Region對(duì)象以及與之相關(guān)的HLog日志記錄以后,會(huì)重新做一遍日志記錄中的各種操作,把日志記錄中的數(shù)據(jù)寫入到MemStore緩存中,然后,刷新到磁盤的StoreFile文件中,完成數(shù)據(jù)恢復(fù)
共用日志優(yōu)點(diǎn):提高對(duì)表的寫操作性能;缺點(diǎn):恢復(fù)時(shí)需要分拆日志
五、HBase性能
1、
行鍵(RowKey)
行鍵是按照字典序存儲(chǔ),因此,設(shè)計(jì)行鍵時(shí),要充分利用這個(gè)排序特點(diǎn),將經(jīng)常一起讀取的數(shù)據(jù)存儲(chǔ)到一塊,將最近可能會(huì)被訪問(wèn)的數(shù)據(jù)放在一塊。
舉個(gè)例子:如果最近寫入HBase表中的數(shù)據(jù)是最可能被訪問(wèn)的,可以考慮將時(shí)間戳作為行鍵的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE- timestamp作為行鍵,這樣能保證新寫入的數(shù)據(jù)在讀取時(shí)可以被快速命中。
InMemory:創(chuàng)建表的時(shí)候,可以通過(guò)HColumnDescriptor.setInMemory(true)將表放到Region服務(wù)器的緩存中,保證在讀取的時(shí)候被cache命中。
Max Version:創(chuàng)建表的時(shí)候,可以通過(guò)HColumnDescriptor.setMaxVersions(int maxVersions)設(shè)置表中數(shù)據(jù)的最大版本,如果只需要保存最新版本的數(shù)據(jù),那么可以設(shè)置setMaxVersions(1)。
Time To Live創(chuàng)建表的時(shí)候,可以通過(guò)HColumnDescriptor.setTimeToLive(inttimeToLive)設(shè)置表中數(shù)據(jù)的存儲(chǔ)生命期,過(guò)期數(shù)據(jù)將自動(dòng)被刪除,例如如果只需要存儲(chǔ)最近兩天的數(shù)據(jù),那么可以設(shè)置setTimeToLive(2* 24 * 60 * 60)。
2、HBaseMaster默認(rèn)基于Web的UI服務(wù)端口為60010,HBase region服務(wù)器默認(rèn)基于Web的UI服務(wù)端口為60030.如果master運(yùn)行在名為master.foo.com的主機(jī)中,mater的主頁(yè)地址就是http://master.foo.com:60010,用戶可以通過(guò)Web瀏覽器輸入這個(gè)地址查看該頁(yè)面
可以查看HBase集群的當(dāng)前狀態(tài)
3、
NoSQL區(qū)別于關(guān)系型數(shù)據(jù)庫(kù)的一點(diǎn)就是NoSQL不使用SQL作為查詢語(yǔ)言,至于為何在NoSQL數(shù)據(jù)存儲(chǔ)HBase上提供SQL接口
易使用,減少編碼
4、HBase只有一個(gè)針對(duì)行健的索引
訪問(wèn)HBase表中的行,只有三種方式:
通過(guò)單個(gè)行健訪問(wèn)
通過(guò)一個(gè)行健的區(qū)間來(lái)訪問(wèn)
全表掃描
總結(jié):
1、HBase數(shù)據(jù)庫(kù)是BigTable的開源實(shí)現(xiàn),和BigTable一樣,支持大規(guī)模海量數(shù)據(jù),分布式并發(fā)數(shù)據(jù)處理效率極高,易于擴(kuò)展且支持動(dòng)態(tài)伸縮,適用于廉價(jià)設(shè)備
2、HBase可以支持NativeJava API、HBaseShell、ThriftGateway、Hive等多種訪問(wèn)接口,可以根據(jù)具體應(yīng)用場(chǎng)合選擇相應(yīng)訪問(wèn)方式
3、HBase實(shí)際上就是一個(gè)稀疏、多維、持久化存儲(chǔ)的映射表,它采用行鍵、列鍵和時(shí)間戳進(jìn)行索引,每個(gè)值都是未經(jīng)解釋的字符串。
4、HBase采用分區(qū)存儲(chǔ),一個(gè)大的表會(huì)被分拆許多個(gè)Region,這些Region會(huì)被分發(fā)到不同的服務(wù)器上實(shí)現(xiàn)分布式存儲(chǔ)
5、HBase的系統(tǒng)架構(gòu)包括客戶端、Zookeeper服務(wù)器、Master主服務(wù)器、Region服務(wù)器。客戶端包含訪問(wèn)HBase的接口;Zookeeper服務(wù)器負(fù)責(zé)提供穩(wěn)定可靠的協(xié)同服務(wù);Master主服務(wù)器主要負(fù)責(zé)表和Region的管理工作;Region服務(wù)器負(fù)責(zé)維護(hù)分配給自己的Region,并響應(yīng)用戶的讀寫請(qǐng)求