1.Hbase起源
HBase是一個開源的非關(guān)系型分布式數(shù)據(jù)庫,它參考了谷歌的BigTable建模瓜客,實現(xiàn)的編程語言為Java剿吻。它是Apache軟件基金會的Hadoop項目的一部分晚伙,運行于HDFS文件系統(tǒng)之上,為 Hadoop 提供類似于BigTable 規(guī)模的服務(wù)絮吵。因此,它可以容錯地存儲海量稀疏的數(shù)據(jù)忱屑。
HBase是一個高可靠蹬敲、高性能、面向列想幻、可伸縮的分布式數(shù)據(jù)庫粱栖,是谷歌BigTable的開源實現(xiàn),主要用來存儲非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)脏毯。HBase的目標是處理非常龐大的表闹究,可以通過水平擴展的方式,利用廉價計算機集群處理由超過10億行數(shù)據(jù)和數(shù)百萬列元素組成的數(shù)據(jù)表食店。
1.1 關(guān)系數(shù)據(jù)庫已經(jīng)流行很多年渣淤,并且Hadoop已經(jīng)有了HDFS和MapReduce,為什么需要HBase?
- Hadoop可以很好地解決大規(guī)模數(shù)據(jù)的離線批量處理問題吉嫩,但是价认,受限于HadoopMapReduce編程框架的高延遲數(shù)據(jù)處理機制,使得Hadoop無法滿足大規(guī)模數(shù)據(jù)實時處理應(yīng)用的需求自娩。
- HDFS面向批量訪問模式用踩,不是隨機訪問模式。
- 傳統(tǒng)的通用關(guān)系型數(shù)據(jù)庫無法應(yīng)對在數(shù)據(jù)規(guī)模劇增時導(dǎo)致的系統(tǒng)擴展性和性能問題(分庫分表也不能很好解決)忙迁。
- 傳統(tǒng)關(guān)系數(shù)據(jù)庫在數(shù)據(jù)結(jié)構(gòu)變化時一般需要停機維護脐彩;空列浪費存儲空間。
1.2HBase與傳統(tǒng)的關(guān)系數(shù)據(jù)庫的區(qū)別主要體現(xiàn)在以下幾個方面:
- 1姊扔、數(shù)據(jù)類型:關(guān)系數(shù)據(jù)庫采用關(guān)系模型惠奸,具有豐富的數(shù)據(jù)類型和存儲方式,HBase則采用了更加簡單的數(shù)據(jù)模型恰梢,它把數(shù)據(jù)存儲為未經(jīng)解釋的字符串佛南。
- 2梗掰、數(shù)據(jù)操作:關(guān)系數(shù)據(jù)庫中包含了豐富的操作,其中會涉及復(fù)雜的多表連接嗅回。HBase操作則不存在復(fù)雜的表與表之間的關(guān)系及穗,只有簡單的插入、查詢妈拌、刪除拥坛、清空等,因為HBase在設(shè)計上就避免了復(fù)雜的表和表之間的關(guān)系尘分。
- 3猜惋、存儲模式:關(guān)系數(shù)據(jù)庫是基于行模式存儲的。HBase是基于列存儲的培愁,每個列族都由幾個文件保存著摔,不同列族的文件是分離的。
- 4定续、數(shù)據(jù)索引:關(guān)系數(shù)據(jù)庫通车兀可以針對不同列構(gòu)建復(fù)雜的多個索引,以提高數(shù)據(jù)訪問性能私股。HBase只有一個索引——行鍵摹察,通過巧妙的設(shè)計,HBase中的所有訪問方法倡鲸,或者通過行鍵訪問供嚎,或者通過行鍵掃描,從而使得整個系統(tǒng)不會慢下來峭状。
- 5克滴、數(shù)據(jù)維護:在關(guān)系數(shù)據(jù)庫中,更新操作會用最新的當(dāng)前值去替換記錄中原來的舊值优床,舊值被覆蓋后就不會存在劝赔。而在HBase中執(zhí)行更新操作時,并不會刪除數(shù)據(jù)舊的版本胆敞,而是生成一個新的版本着帽,舊有的版本仍然保留。
- 6移层、可伸縮性:關(guān)系數(shù)據(jù)庫很難實現(xiàn)橫向擴展仍翰,縱向擴展的空間也比較有限。相反幽钢,HBase和BigTable這些分布式數(shù)據(jù)庫就是為了實現(xiàn)靈活的水平擴展而開發(fā)的,能夠輕易地通過在集群中增加或者減少硬件數(shù)量來實現(xiàn)性能的伸縮傅是。
2.Hbase訪問接口
3.Hbase數(shù)據(jù)模型
Hbase是一個稀疏匪燕、多維度蕾羊、排序的映射表,這張表的索引是行鍵帽驯、列族龟再、列限定符和時間戳。
- 每個值是一個未經(jīng)解釋的字符串尼变,沒有數(shù)據(jù)類型利凑。用戶在表中存儲數(shù)據(jù),每一行都有一個可排序的行鍵和任意多的列嫌术。
- 表在水平方向由一個或多個列族組成哀澈,一個列族中可以包含任意多個列,同一個列族里面的數(shù)據(jù)存儲在一起度气。
- 列族支持動態(tài)擴展割按,可以很輕松地添加一個列族或列,無需預(yù)先定義列的數(shù)量以及類型磷籍,所有列均以字符串形式存儲适荣,用戶需要自行進行數(shù)據(jù)類型轉(zhuǎn)換。
- HBase中執(zhí)行更新操作時院领,并不會刪除數(shù)據(jù)舊的版本弛矛,而是生成一個新的版本,舊的版本仍然保留(這是和HDFS只允許追加不允許修改的特性相關(guān)的)
下面對上圖的一個具體解釋:
表:HBase采用表來組織數(shù)據(jù)比然,表由行和列組成丈氓,列劃分為若干列族。
行:每個HBase表都由若干行組成谈秫,每個行由行鍵(row key)來標識扒寄。
列族:一個HBase表被分組成許多“列族”(Column Family)的集合,它是基本的訪問控制單元拟烫。
列限定符:列族里的數(shù)據(jù)通過限定符(或列)來定位该编。
單元格:在HBase表中,通過行硕淑、列族和列限定符確定一個“單元格”(cell)课竣,單元格中存儲的數(shù)據(jù)沒有數(shù)據(jù)類型,總被視為字節(jié)數(shù)組byte[]
時間戳:每個單元格都保存著同一份數(shù)據(jù)的多個版本置媳,這些版本采用時間戳進行索引于樟。
4.Hbase的實現(xiàn)原理
HBase的實現(xiàn)包括三個主要的功能組件:
- 1、庫函數(shù):鏈接到每個客戶端
- 2拇囊、一個Master主服務(wù)器
- 3迂曲、許多個Region服務(wù)器
主服務(wù)器Master負責(zé)管理和維護Hbase表的分區(qū)信息,維護Region服務(wù)器列表寥袭,分配Region路捧,負載均衡关霸。
Region服務(wù)器負責(zé)存儲和維護分配給自己的Region,處理來自客戶端的讀寫請求杰扫。
客戶端并不是直接從Master主服務(wù)器上讀取數(shù)據(jù)队寇,而是在獲得Region的存儲位置信息后,直接從Region服務(wù)器上讀取數(shù)據(jù)章姓。
客戶端并不依賴Master佳遣,而是通過Zookeeper來Region位置信息,大多數(shù)客戶端甚至從來不和Master通信凡伊,這種設(shè)計方式使得Master負載很小零渐。
4.1表和Region
一個HBase表被劃分成多個Region。
開始只有一個Region窗声,后臺不斷分裂相恃。Region拆分操作非常快笨觅,接近瞬間拦耐,因為拆分之后Region讀取的仍然是原存儲文件,直到“合并”過程把存儲文件異步地寫到獨立的文件之后见剩,才會讀取新文件杀糯。
4.2Region的定位
元數(shù)據(jù)表,又名.META.表,存儲了Region和Region服務(wù)器的映射關(guān)系。當(dāng)HBase表很大時划咐, .META.表也會被分裂成多個Region
根數(shù)據(jù)表巾乳,又名-ROOT-表或衡,記錄所有元數(shù)據(jù)的具體位置,-ROOT-表只有唯一一個Region,名字是在程序中被寫死的。Zookeeper文件記錄了-ROOT-表的位置
Hbase的三層結(jié)構(gòu)圖如下:
客戶端訪問數(shù)據(jù)時的“三級尋址”:
- 為了加速尋址歉铝,客戶端會緩存位置信息,同時凑耻,需要解決緩存失效問題太示。
- 尋址過程客戶端只需要詢問Zookeeper服務(wù)器,不需要連接Master服務(wù)器香浩。
5.Hbase系統(tǒng)架構(gòu)
客戶端
客戶端包含訪問Hbase的接口类缤,同時在緩存中維護著已經(jīng)訪問過的Region位置信息,用來加快后續(xù)數(shù)據(jù)訪問過程邻吭。
Zookeeper服務(wù)器
Zookeeper可以幫助選舉出一個Master作為集群的總管餐弱,并保證在任何時刻總有唯一一個Master在運行,這就避免了Master的“單點失效”的問題。
Master服務(wù)器
主服務(wù)器Master主要負責(zé)表和Region的管理工作:
- 管理用戶對表的增加膏蚓、刪除猖败、修改、查詢等操作
- 實現(xiàn)不同Region服務(wù)器之間的負載均衡
- 在Region分裂或合并后降允,負責(zé)重新調(diào)整Region的分布
- 對發(fā)生故障失效的Region服務(wù)器上Region進行遷移
Region服務(wù)器
Region服務(wù)器是Hbase中最核心的模塊,負責(zé)維護分配給自己的Region艺糜,并響應(yīng)用戶的讀寫請求剧董。
5.1Region服務(wù)器工作原理
Region服務(wù)器向HDFS文件系統(tǒng)中讀寫數(shù)據(jù)過程:
- 1、用戶讀寫數(shù)據(jù)過程
- 用戶寫入數(shù)據(jù)時破停,被分配到相應(yīng)Region服務(wù)器去執(zhí)行
- 用戶數(shù)據(jù)首先被寫入到MEMStore和Hlog中
- 只有當(dāng)操作寫入Hlog之后翅楼,commit()調(diào)用才會將其返回給客戶端
- 當(dāng)用戶讀取數(shù)據(jù)時,Region服務(wù)器首先訪問MEMStore緩存真慢,如果找不到毅臊,再去磁盤上面的StoreFile中尋找
- 2、緩存的刷新
- 系統(tǒng)會周期性地把MemStore緩存里的內(nèi)容刷寫到磁盤的StoreFile文件中黑界,清空緩存管嬉,并在Hlog里面寫入一個標記
- 每次刷寫都生成一個新的StoreFile文件,因此朗鸠,每個Store包含多個StoreFile文件
- 每個Region服務(wù)器都有一個自己的HLog 文件蚯撩,每次啟動都檢查該文件,確認最近一次執(zhí)行緩存刷新操作之后是否發(fā)生新的寫入操作烛占;如果發(fā)現(xiàn)更新胎挎,則先寫入MemStore,再刷寫到StoreFile忆家,最后刪除舊的Hlog文件犹菇,開始為用戶提供服務(wù)。
- 3芽卿、StoreFile的合并
- 每次刷寫都生成一個新的StoreFile揭芍,數(shù)量太多,影響查找速度蹬竖、
- 調(diào)用Store.compact()把多個合并成一個
- 合并操作比較耗費資源沼沈,只有數(shù)量達到一個閾值才啟動合并
6.在Hbase之上構(gòu)建SQL引擎
NoSQL區(qū)別于關(guān)系型數(shù)據(jù)庫的一點就是NoSQL不使用SQL作為查詢語言,至于為何在NoSQL數(shù)據(jù)存儲HBase上提供SQL接口币厕,有如下原因:
- 1列另、易使用。使用諸如SQL這樣易于理解的語言旦装,使人們能夠更加輕松地使用Hasee页衙。
- 2、減少編碼。使用諸如SQL這樣更高層次的語言來編寫店乐,減少了編寫的代碼量艰躺。
解決方案:Hive整合HBase
Hive與HBase的整合功能從Hive0.6.0版本已經(jīng)開始出現(xiàn),利用兩者對外的API接口互相通信眨八,通信主要依靠hive_hbase-handler.jar工具包(Hive
Storage Handlers)腺兴。由于HBase有一次比較大的版本變動,所以并不是每個版本的Hive都能和現(xiàn)有的HBase版本進行整合廉侧,所以在使用過程中特別注意的就是兩者版本的一致性页响。
7.構(gòu)建Hbase二級索引
HBase只有一個針對行鍵的索引,訪問Hbase表中的行段誊,只有三種方式:
- 通過單個行鍵訪問
- 通過一個行鍵的區(qū)間來訪問
- 全表掃描
使用其他產(chǎn)品為Hbase行鍵提供索引功能:
- Hindex二級索引
- Hbase+Redis
- Hbase+solr