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

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


咨詢
建站咨詢
