新聞中心
1 HBase簡介
HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),利用HBase技術(shù)可在廉價PC Server上搭建大規(guī)模結(jié)構(gòu)化的存儲集群。HBase的目標(biāo)是存儲并處理大型數(shù)據(jù),具體來說是僅需使用普通的硬件配置,就能夠處理由成千上萬的行和列所組成的大型數(shù)據(jù)。

創(chuàng)新互聯(lián)公司擁有十余年的建站服務(wù)經(jīng)驗(yàn),在此期間,我們發(fā)現(xiàn)較多的客戶在挑選建站服務(wù)商前都非常的猶豫。主要問題集中:在無法預(yù)知自己的網(wǎng)站呈現(xiàn)的效果是什么樣的?也無法判斷選擇的服務(wù)商設(shè)計(jì)出來的網(wǎng)頁效果自己是否會滿意?創(chuàng)新互聯(lián)公司業(yè)務(wù)涵蓋了互聯(lián)網(wǎng)平臺網(wǎng)站建設(shè)、移動平臺網(wǎng)站制作、網(wǎng)絡(luò)推廣、按需求定制網(wǎng)站等服務(wù)。創(chuàng)新互聯(lián)公司網(wǎng)站開發(fā)公司本著不拘一格的網(wǎng)站視覺設(shè)計(jì)和網(wǎng)站開發(fā)技術(shù)相結(jié)合,為企業(yè)做網(wǎng)站提供成熟的網(wǎng)站設(shè)計(jì)方案。
與MapReduce的離線批處理計(jì)算框架不同,HBase是一個可以隨機(jī)訪問的存儲和檢索數(shù)據(jù)平臺,彌補(bǔ)了HDFS不能隨機(jī)訪問數(shù)據(jù)的缺陷,適合實(shí)時性要求不是非常高的業(yè)務(wù)場景。HBase存儲的都是Byte數(shù)組,它不介意數(shù)據(jù)類型,允許動態(tài)、靈活的數(shù)據(jù)模型。
上圖描述了Hadoop 2.0生態(tài)系統(tǒng)中的各層結(jié)構(gòu)。其中HBase位于結(jié)構(gòu)化存儲層,HDFS為HBase提供了高可靠性的底層存儲支持, MapReduce為HBase提供了高性能的批處理能力,Zookeeper為HBase提供了穩(wěn)定服務(wù)和failover機(jī)制,Pig和Hive為HBase提供了進(jìn)行數(shù)據(jù)統(tǒng)計(jì)處理的高層語言支持,Sqoop則為HBase提供了便捷的RDBMS數(shù)據(jù)導(dǎo)入功能,使業(yè)務(wù)數(shù)據(jù)從傳統(tǒng)數(shù)據(jù)庫向HBase遷移變的非常方便。
2 HBase體系結(jié)構(gòu)
2.1 設(shè)計(jì)思路
HBase是一個分布式的數(shù)據(jù)庫,使用Zookeeper管理集群,使用HDFS作為底層存儲。在架構(gòu)層面上由HMaster(Zookeeper選舉產(chǎn)生的Leader)和多個HRegionServer組成,基本架構(gòu)如下圖所示:
在HBase的概念中,HRegionServer對應(yīng)集群中的一個節(jié)點(diǎn),一個HRegionServer負(fù)責(zé)管理多個HRegion,而一個HRegion代表一張表的一部分?jǐn)?shù)據(jù)。在HBase中,一張表可能會需要很多個HRegion來存儲數(shù)據(jù),每個HRegion中的數(shù)據(jù)并不是雜亂無章的。HBase在管理HRegion的時候會給每個HRegion定義一個Rowkey的范圍,落在特定范圍內(nèi)的數(shù)據(jù)將交給特定的Region,從而將負(fù)載分?jǐn)偟蕉鄠€節(jié)點(diǎn),這樣就充分利用了分布式的優(yōu)點(diǎn)和特性。另外,HBase會自動調(diào)節(jié)Region所處的位置,如果一個HRegionServer過熱,即大量的請求落在這個HRegionServer管理的HRegion上,HBase就會把HRegion移動到相對空閑的其它節(jié)點(diǎn),依次保證集群環(huán)境被充分利用。
2.2 基本架構(gòu)
HBase由HMaster和HRegionServer組成,同樣遵從主從服務(wù)器架構(gòu)。HBase將邏輯上的表劃分成多個數(shù)據(jù)塊即HRegion,存儲在HRegionServer中。HMaster負(fù)責(zé)管理所有的HRegionServer,它本身并不存儲任何數(shù)據(jù),而只是存儲數(shù)據(jù)到HRegionServer的映射關(guān)系(元數(shù)據(jù))。集群中的所有節(jié)點(diǎn)通過Zookeeper進(jìn)行協(xié)調(diào),并處理HBase運(yùn)行期間可能遇到的各種問題。HBase的基本架構(gòu)如下圖所示:
Client:使用HBase的RPC機(jī)制與HMaster和HRegionServer進(jìn)行通信,提交請求和獲取結(jié)果。對于管理類操作,Client與HMaster進(jìn)行RPC;對于數(shù)據(jù)讀寫類操作,Client與HRegionServer進(jìn)行RPC。
Zookeeper:通過將集群各節(jié)點(diǎn)狀態(tài)信息注冊到Zookeeper中,使得HMaster可隨時感知各個HRegionServer的健康狀態(tài),而且也能避免HMaster的單點(diǎn)問題。
HMaster:管理所有的HRegionServer,告訴其需要維護(hù)哪些HRegion,并監(jiān)控所有HRegionServer的運(yùn)行狀態(tài)。當(dāng)一個新的HRegionServer登錄到HMaster時,HMaster會告訴它等待分配數(shù)據(jù);而當(dāng)某個HRegion死機(jī)時,HMaster會把它負(fù)責(zé)的所有HRegion標(biāo)記為未分配,然后再把它們分配到其他HRegionServer中。HMaster沒有單點(diǎn)問題,HBase可以啟動多個HMaster,通過Zookeeper的選舉機(jī)制保證集群中總有一個HMaster運(yùn)行,從而提高了集群的可用性。
HRegion:當(dāng)表的大小超過預(yù)設(shè)值的時候,HBase會自動將表劃分為不同的區(qū)域,每個區(qū)域包含表中所有行的一個子集。對用戶來說,每個表是一堆數(shù)據(jù)的集合,靠主鍵(RowKey)來區(qū)分。從物理上來說,一張表被拆分成了多塊,每一塊就是一個HRegion。我們用表名+開始/結(jié)束主鍵,來區(qū)分每一個HRegion,一個HRegion會保存一個表中某段連續(xù)的數(shù)據(jù),一張完整的表數(shù)據(jù)是保存在多個HRegion中的。
HRegionServer:HBase中的所有數(shù)據(jù)從底層來說一般都是保存在HDFS中的,用戶通過一系列HRegionServer獲取這些數(shù)據(jù)。集群一個節(jié)點(diǎn)上一般只運(yùn)行一個HRegionServer,且每一個區(qū)段的HRegion只會被一個HRegionServer維護(hù)。HRegionServer主要負(fù)責(zé)響應(yīng)用戶I/O請求,向HDFS文件系統(tǒng)讀寫數(shù)據(jù),是HBase中最核心的模塊。HRegionServer內(nèi)部管理了一系列HRegion對象,每個HRegion對應(yīng)了邏輯表中的一個連續(xù)數(shù)據(jù)段。HRegion由多個HStore組成,每個HStore對應(yīng)了邏輯表中的一個列族的存儲,可以看出每個列族其實(shí)就是一個集中的存儲單元。因此,為了提高操作效率,最好將具備共同I/O特性的列放在一個列族中。
HStore:它是HBase存儲的核心,由MemStore和StoreFiles兩部分組成。MemStore是內(nèi)存緩沖區(qū),用戶寫入的數(shù)據(jù)首先會放入MemStore,當(dāng)MemStore滿了以后會Flush成一個StoreFile(底層實(shí)現(xiàn)是HFile),當(dāng)StoreFile的文件數(shù)量增長到一定閾值后,會觸發(fā)Compact合并操作,將多個StoreFiles合并成一個StoreFile,合并過程中會進(jìn)行版本合并和數(shù)據(jù)刪除操作。因此,可以看出HBase其實(shí)只有增加數(shù)據(jù),所有的更新和刪除操作都是在后續(xù)的Compact過程中進(jìn)行的,這樣使得用戶的寫操作只要進(jìn)入內(nèi)存就可以立即返回,保證了HBaseI/O的高性能。當(dāng)StoreFiles Compact后,會逐步形成越來越大的StoreFile,當(dāng)單個StoreFile大小超過一定閾值后,會觸發(fā)Split操作,同時把當(dāng)前的HRegion Split成2個HRegion,父HRegion會下線,新分出的2個子HRegion會被HMaster分配到相應(yīng)的HRegionServer,使得原先1個HRegion的負(fù)載壓力分流到2個HRegion上。
HLog:每個HRegionServer中都有一個HLog對象,它是一個實(shí)現(xiàn)了Write Ahead Log的預(yù)寫日志類。在每次用戶操作將數(shù)據(jù)寫入MemStore的時候,也會寫一份數(shù)據(jù)到HLog文件中,HLog文件會定期滾動刷新,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。當(dāng)HMaster通過Zookeeper感知到某個HRegionServer意外終止時,HMaster首先會處理遺留的 HLog文件,將其中不同HRegion的HLog數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)HRegion的目錄下,然后再將失效的HRegion重新分配,領(lǐng)取到這些HRegion的HRegionServer在加載 HRegion的過程中,會發(fā)現(xiàn)有歷史HLog需要處理,因此會Replay HLog中的數(shù)據(jù)到MemStore中,然后Flush到StoreFiles,完成數(shù)據(jù)恢復(fù)。
2.3 ROOT表和META表
HBase的所有HRegion元數(shù)據(jù)被存儲在.META.表中,隨著HRegion的增多,.META.表中的數(shù)據(jù)也會增大,并分裂成多個新的HRegion。為了定位.META.表中各個HRegion的位置,把.META.表中所有HRegion的元數(shù)據(jù)保存在-ROOT-表中,最后由Zookeeper記錄-ROOT-表的位置信息。所有客戶端訪問用戶數(shù)據(jù)前,需要首先訪問Zookeeper獲得-ROOT-的位置,然后訪問-ROOT-表獲得.META.表的位置,最后根據(jù).META.表中的信息確定用戶數(shù)據(jù)存放的位置,如下圖所示。
-ROOT-表永遠(yuǎn)不會被分割,它只有一個HRegion,這樣可以保證最多只需要三次跳轉(zhuǎn)就可以定位任意一個HRegion。為了加快訪問速度,.META.表的所有HRegion全部保存在內(nèi)存中。客戶端會將查詢過的位置信息緩存起來,且緩存不會主動失效。如果客戶端根據(jù)緩存信息還訪問不到數(shù)據(jù),則詢問相關(guān).META.表的Region服務(wù)器,試圖獲取數(shù)據(jù)的位置,如果還是失敗,則詢問-ROOT-表相關(guān)的.META.表在哪里。最后,如果前面的信息全部失效,則通過ZooKeeper重新定位HRegion的信息。所以如果客戶端上的緩存全部是失效,則需要進(jìn)行6次網(wǎng)絡(luò)來回,才能定位到正確的HRegion。
3 HBase數(shù)據(jù)模型
HBase是一個類似于BigTable的分布式數(shù)據(jù)庫,它是一個稀疏的長期存儲的(存在HDFS上)、多維度的、排序的映射表。這張表的索引是行關(guān)鍵字、列關(guān)鍵字和時間戳。HBase的數(shù)據(jù)都是字符串,沒有類型。
可以將一個表想象成一個大的映射關(guān)系,通過行鍵、行鍵+時間戳或行鍵+列(列族:列修飾符),就可以定位特定數(shù)據(jù)。由于HBase是稀疏存儲數(shù)據(jù)的,所以某些列可以是空白的。上表給出了com.cnn.www網(wǎng)站的數(shù)據(jù)存放邏輯視圖,表中僅有一行數(shù)據(jù),行的唯一標(biāo)識為“com.cnn.www”,對這行數(shù)據(jù)的每一次邏輯修改都有一個時間戳關(guān)聯(lián)對應(yīng)。表中共有四列:contents:html、anchor:cnnsi.com、anchor:my.look.ca、mime:type,每一列以前綴的方式給出其所屬的列族。
行鍵(RowKey)是數(shù)據(jù)行在表中的唯一標(biāo)識,并作為檢索記錄的主鍵。在HBase中訪問表中的行只有三種方式:通過某個行鍵訪問、給定行鍵的范圍訪問、全表掃描。行鍵可以是任意字符串(最大長度64KB)并按照字典序進(jìn)行存儲。對于那些經(jīng)常一起讀取的行,需要對鍵值精心設(shè)計(jì),以便它們能放在一起存儲。
4 HBase讀寫流程
上圖是HRegionServer數(shù)據(jù)存儲關(guān)系圖。上文提到,HBase使用MemStore和StoreFile存儲對表的更新。數(shù)據(jù)在更新時首先寫入HLog和MemStore。MemStore中的數(shù)據(jù)是排序的,當(dāng)MemStore累計(jì)到一定閾值時,就會創(chuàng)建一個新的MemStore,并且將老的MemStore添加到Flush隊(duì)列,由單獨(dú)的線程Flush到磁盤上,成為一個StoreFile。與此同時,系統(tǒng)會在Zookeeper中記錄一個CheckPoint,表示這個時刻之前的數(shù)據(jù)變更已經(jīng)持久化了。當(dāng)系統(tǒng)出現(xiàn)意外時,可能導(dǎo)致MemStore中的數(shù)據(jù)丟失,此時使用HLog來恢復(fù)CheckPoint之后的數(shù)據(jù)。
StoreFile是只讀的,一旦創(chuàng)建后就不可以再修改。因此Hbase的更新其實(shí)是不斷追加的操作。當(dāng)一個Store中的StoreFile達(dá)到一定閾值后,就會進(jìn)行一次合并操作,將對同一個key的修改合并到一起,形成一個大的StoreFile。當(dāng)StoreFile的大小達(dá)到一定閾值后,又會對 StoreFile進(jìn)行切分操作,等分為兩個StoreFile。
4.1 寫操作流程
步驟1:Client通過Zookeeper的調(diào)度,向HRegionServer發(fā)出寫數(shù)據(jù)請求,在HRegion中寫數(shù)據(jù)。
步驟2:數(shù)據(jù)被寫入HRegion的MemStore,直到MemStore達(dá)到預(yù)設(shè)閾值。
步驟3:MemStore中的數(shù)據(jù)被Flush成一個StoreFile。
步驟4:隨著StoreFile文件的不斷增多,當(dāng)其數(shù)量增長到一定閾值后,觸發(fā)Compact合并操作,將多個StoreFile合并成一個StoreFile,同時進(jìn)行版本合并和數(shù)據(jù)刪除。
步驟5:StoreFiles通過不斷的Compact合并操作,逐步形成越來越大的StoreFile。
步驟6:單個StoreFile大小超過一定閾值后,觸發(fā)Split操作,把當(dāng)前HRegion Split成2個新的HRegion。父HRegion會下線,新Split出的2個子HRegion會被HMaster分配到相應(yīng)的HRegionServer 上,使得原先1個HRegion的壓力得以分流到2個HRegion上。
4.2 讀操作流程
步驟1:client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息。
步驟2:從.META.表查找,獲取存放目標(biāo)數(shù)據(jù)的HRegion信息,從而找到對應(yīng)的HRegionServer。
步驟3:通過HRegionServer獲取需要查找的數(shù)據(jù)。
步驟4:HRegionserver的內(nèi)存分為MemStore和BlockCache兩部分,MemStore主要用于寫數(shù)據(jù),BlockCache主要用于讀數(shù)據(jù)。讀請求先到MemStore中查數(shù)據(jù),查不到就到BlockCache中查,再查不到就會到StoreFile上讀,并把讀的結(jié)果放入BlockCache。
5 HBase使用場景
半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù):對于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或雜亂無章,很難按一個概念去進(jìn)行抽取的數(shù)據(jù)適合用HBase。如隨著業(yè)務(wù)發(fā)展需要存儲更多的字段時,RDBMS需要停機(jī)維護(hù)更改表結(jié)構(gòu),而HBase支持動態(tài)增加。
記錄非常稀疏:RDBMS的行有多少列是固定的,為空的列浪費(fèi)了存儲空間。而HBase為空的列不會被存儲,這樣既節(jié)省了空間又提高了讀性能。
多版本數(shù)據(jù):根據(jù)RowKey和列標(biāo)識符定位到的Value可以有任意數(shù)量的版本值(時間戳不同),因此對于需要存儲變動歷史記錄的數(shù)據(jù),用HBase將非常方便。
超大數(shù)據(jù)量:當(dāng)數(shù)據(jù)量越來越大,RDBMS數(shù)據(jù)庫撐不住了,就出現(xiàn)了讀寫分離策略,通過一個Master專門負(fù)責(zé)寫操作,多個Slave負(fù)責(zé)讀操作,服務(wù)器成本倍增。隨著壓力增加,Master撐不住了,這時就要分庫了,把關(guān)聯(lián)不大的數(shù)據(jù)分開部署,一些join查詢不能用了,需要借助中間層。隨著數(shù)據(jù)量的進(jìn)一步增加,一個表的記錄越來越大,查詢就變得很慢,于是又得搞分表,比如按ID取模分成多個表以減少單個表的記錄數(shù)。經(jīng)歷過這些事的人都知道過程是多么的折騰。采用HBase就簡單了,只需要在集群中加入新的節(jié)點(diǎn)即可,HBase會自動水平切分?jǐn)U展,跟Hadoop的無縫集成保障了數(shù)據(jù)的可靠性(HDFS)和海量數(shù)據(jù)分析的高性能(MapReduce)。
6 HBase的MapReduce
HBase中Table和Region的關(guān)系,有些類似HDFS中File和Block的關(guān)系。由于HBase提供了配套的與MapReduce進(jìn)行交互的API如TableInputFormat和TableOutputFormat,可以將HBase的數(shù)據(jù)表直接作為Hadoop MapReduce的輸入和輸出,從而方便了MapReduce應(yīng)用程序的開發(fā),基本不需要關(guān)注HBase系統(tǒng)自身的處理細(xì)節(jié)。
當(dāng)前題目:簡單講解一下HBase工作原理
鏈接URL:http://www.fisionsoft.com.cn/article/dpjsjoh.html


咨詢
建站咨詢
