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

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


咨詢
建站咨詢
