Hbase:原理和设计
轉(zhuǎn)載自:http://www.sysdb.cn/index.php/2016/01/10/hbase_principle/ ,感謝原作者。
簡(jiǎn)介
HBase —— Hadoop Database的簡(jiǎn)稱,Google BigTable的另一種開(kāi)源實(shí)現(xiàn)方式,從問(wèn)世之初,就為了解決用大量廉價(jià)的機(jī)器高速存取海量數(shù)據(jù)、實(shí)現(xiàn)數(shù)據(jù)分布式存儲(chǔ)提供可靠的方案。從功能上來(lái)講,HBase不折不扣是一個(gè)數(shù)據(jù)庫(kù),與我們熟悉的Oracle、MySQL、MSSQL等一樣,對(duì)外提供數(shù)據(jù)的存儲(chǔ)和讀取服務(wù)。而從應(yīng)用的角度來(lái)說(shuō),HBase與一般的數(shù)據(jù)庫(kù)又有所區(qū)別,HBase本身的存取接口相當(dāng)簡(jiǎn)單,不支持復(fù)雜的數(shù)據(jù)存取,更不支持SQL等結(jié)構(gòu)化的查詢語(yǔ)言;HBase也沒(méi)有除了rowkey以外的索引,所有的數(shù)據(jù)分布和查詢都依賴rowkey。所以,HBase在表的設(shè)計(jì)上會(huì)有很嚴(yán)格的要求。架構(gòu)上,HBase是分布式數(shù)據(jù)庫(kù)的典范,這點(diǎn)比較像MongoDB的sharding模式,能根據(jù)鍵值的大小,把數(shù)據(jù)分布到不同的存儲(chǔ)節(jié)點(diǎn)上,MongoDB根據(jù)configserver來(lái)定位數(shù)據(jù)落在哪個(gè)分區(qū)上,HBase通過(guò)訪問(wèn)Zookeeper來(lái)獲取-ROOT-表所在地址,通過(guò)-ROOT-表得到相應(yīng).META.表信息,從而獲取數(shù)據(jù)存儲(chǔ)的region位置。
?
架構(gòu)
上面提到,HBase是一個(gè)分布式的架構(gòu),除去底層存儲(chǔ)的HDFS外,HBase本身從功能上可以分為三塊:Zookeeper群、Master群和RegionServer群。
- Zookeeper群:HBase集群中不可缺少的重要部分,主要用于存儲(chǔ)Master地址、協(xié)調(diào)Master和RegionServer等上下線、存儲(chǔ)臨時(shí)數(shù)據(jù)等等。
- Master群:Master主要是做一些管理操作,如:region的分配,手動(dòng)管理操作下發(fā)等等,一般數(shù)據(jù)的讀寫操作并不需要經(jīng)過(guò)Master集群,所以Master一般不需要很高的配置即可。
- RegionServer群:RegionServer群是真正數(shù)據(jù)存儲(chǔ)的地方,每個(gè)RegionServer由若干個(gè)region組成,而一個(gè)region維護(hù)了一定區(qū)間rowkey值的數(shù)據(jù),整個(gè)結(jié)構(gòu)如下圖:
?
?
上圖中,Zookeeper(簡(jiǎn)稱ZK)是一個(gè)集群,通常有奇數(shù)個(gè)ZK服務(wù)組成。Master為了服務(wù)可用性,也建議部署成集群方式,因?yàn)?Master是整個(gè)管理操作的發(fā)起者,如果Master一旦發(fā)生意外停機(jī),整個(gè)集群將會(huì)無(wú)法進(jìn)行管理操作,所以Master也必須有多個(gè),當(dāng)然多個(gè) Master也有主從之分,如何區(qū)分哪個(gè)是主,哪個(gè)是從?關(guān)鍵看哪個(gè)Master能競(jìng)爭(zhēng)到ZK上對(duì)應(yīng)Master目錄下的鎖,持有該目錄鎖的Master 為主Master,其他從Master輪詢競(jìng)爭(zhēng)該鎖,所以一旦主Master發(fā)生意外停機(jī),從Master很快會(huì)因?yàn)楦?jìng)爭(zhēng)到Master文件夾上的鎖而接管服務(wù)。
?
RegionServer(簡(jiǎn)稱RS)在非Replication模式下,整個(gè)系統(tǒng)中都是唯一的,也就是說(shuō),在整個(gè)非Replication的 HBase集群中,每臺(tái)RS上保存的數(shù)據(jù)都不一樣,所以相對(duì)于前面兩者,該模式下的RS并不是高可用的,至少RS可能存在單點(diǎn)故障的問(wèn)題,但是由于 HBase內(nèi)部數(shù)據(jù)分region存儲(chǔ)和region可以遷移的機(jī)制,RS服務(wù)的單點(diǎn)故障可能會(huì)在極小代價(jià)下很快恢復(fù),但是一旦停掉的RS上有 -ROOT-或者.META.表的region,那后果還是比較嚴(yán)重,因?yàn)閿?shù)據(jù)節(jié)點(diǎn)的RS停機(jī),只會(huì)在短時(shí)間內(nèi)影響該臺(tái)RS上的region不可訪問(wèn),等 到region遷移完成后即可恢復(fù),如果是-ROOT-、.META.所在的RS停機(jī),整個(gè)HBase的新的求情都將受到影響,因?yàn)樾枰ㄟ^(guò).META. 表來(lái)路由,從而尋找到region所在RS的地址。
?
數(shù)據(jù)組織
?
整個(gè)架構(gòu)中,ZK用于服務(wù)協(xié)調(diào)和整個(gè)集群運(yùn)行過(guò)程中部分信息的保存和-ROOT-表地址定位,Master用于集群內(nèi)部管理,所以剩下的RS主要用于處理數(shù)據(jù)。
RS是處理數(shù)據(jù)的主要場(chǎng)所,那么在RS內(nèi)部的數(shù)據(jù)是怎么分布的?其實(shí)RS本身只是一個(gè)容器,其定義了一些功能線程,比如:數(shù)據(jù)合并線程 (compact thread)、storeFile分割線程(split thread)等等。容器中的主要對(duì)象就是region,region是一個(gè)表根據(jù)自身rowkey范圍劃分的一部分,一個(gè)表可以被劃分成若干部分,也就 是若干個(gè)region,region可以根據(jù)rowkey范圍不同而被分布在不同的RS上(當(dāng)然也可以在同一個(gè)RS上,但不建議這么做)。一個(gè)RS上可以 包含多個(gè)表的region,也可以只包含一個(gè)表的部分region,RS和表是兩個(gè)不同的概念。
這里還有一個(gè)概念——列簇。對(duì)HBase有一些了解的人,或多或少聽(tīng)說(shuō)過(guò):HBase是一個(gè)列式存儲(chǔ)的數(shù)據(jù)庫(kù),而這個(gè)列式存儲(chǔ)中的列,其實(shí)是區(qū)別于 一般數(shù)據(jù)庫(kù)的列,這里的列的概念,就是列簇,列簇,顧名思義就是很多列的集合,而在數(shù)據(jù)存儲(chǔ)上來(lái)講,不同列簇的數(shù)據(jù),一定是分開(kāi)存儲(chǔ)的,即使是在同一個(gè) region內(nèi)部,不同的列簇也存儲(chǔ)在不同的文件夾中,這樣做的好處是,一般我們定義列簇的時(shí)候,通常會(huì)把類似的數(shù)據(jù)放入同一個(gè)列簇,不同的列簇分開(kāi)存 儲(chǔ),有利于數(shù)據(jù)的壓縮,并且HBase本身支持多種壓縮方式。
?
原理
?
前面介紹了HBase的一般架構(gòu),我們知道了HBase有ZK、Master和RS等組成,本節(jié)我們來(lái)介紹下HBase的基本原理,從數(shù)據(jù)訪問(wèn)、RS路由到RS內(nèi)部緩存、數(shù)據(jù)存儲(chǔ)和刷寫再到region的合并和拆分等等功能。
RegionServer定位
訪問(wèn)HBase通過(guò)HBase客戶端(或API)進(jìn)行,整個(gè)HBase提供給外部的地址,其實(shí)是ZK的入口,前面也介紹了,ZK中有保存 -ROOT-所在的RS地址,從-ROOT-表可以獲取.META.表信息,根據(jù).META.表可以獲取region在RS上的分布,整個(gè)region尋 址過(guò)程大致如下:
?
?
?
上述過(guò)程其實(shí)是一個(gè)三層索引結(jié)構(gòu),從ZK獲取-ROOT-信息,再?gòu)?ROOT-獲取.META.表信息,最后從.META.表中查到RS地址后緩存。這里有幾個(gè)問(wèn)題:
?
- 既然ZK中能保存-ROOT-信息,那么為什么不把.META.信息直接保存在ZK中,而需要通過(guò)-ROOT-表來(lái)定位?
- Client查找到目標(biāo)地址后,下一次請(qǐng)求還需要走ZK –> -ROOT- –>.META.這個(gè)流程么?
?
先來(lái)回答第一個(gè)問(wèn)題:為什么不直接把.META.表信息直接保存到ZK中?主要是為了保存的數(shù)據(jù)量考慮,ZK中不宜保存大量數(shù)據(jù),而.META.表 主要是保存Region和RS的映射信息,region的數(shù)量沒(méi)有具體約束,只要在內(nèi)存允許的范圍內(nèi),region數(shù)量可以有很多,如果保存在ZK 中,ZK的壓力會(huì)很大。所以,通過(guò)一個(gè)-ROOT-表來(lái)轉(zhuǎn)存到RS中是一個(gè)比較理想的方案,相比直接保存在ZK中,也就多了一層-ROOT-表的查詢,對(duì) 性能來(lái)說(shuō)影響不大。
?
第二個(gè)問(wèn)題:每次訪問(wèn)都需要走ZK –> -ROOT- —> .META.的流程么?當(dāng)然不需要,Client端有緩存,第一次查詢到相應(yīng)region所在RS后,這個(gè)信息將被緩存到Client端,以后每次訪問(wèn)都 直接從緩存中獲取RS地址即可。當(dāng)然這里有個(gè)意外:訪問(wèn)的region若果在RS上發(fā)生了改變,比如被balancer遷移到其他RS上了,這個(gè)時(shí)候,通 過(guò)緩存的地址訪問(wèn)會(huì)出現(xiàn)異常,在出現(xiàn)異常的情況下,Client需要重新走一遍上面的流程來(lái)獲取新的RS地址。總體來(lái)說(shuō),region的變動(dòng)只會(huì)在極少數(shù) 情況下發(fā)生,一般變動(dòng)不會(huì)很大,所以在整個(gè)集群訪問(wèn)過(guò)程中,影響可以忽略。
?
Region數(shù)據(jù)寫入
HBase通過(guò)ZK –> -ROOT- –>.META.的訪問(wèn)獲取RS地址后,直接向該RS上進(jìn)行數(shù)據(jù)寫入操作,整個(gè)過(guò)程如下圖:
?
?
Client通過(guò)三層索引獲得RS的地址后,即可向指定RS的對(duì)應(yīng)region進(jìn)行數(shù)據(jù)寫入,HBase的數(shù)據(jù)寫入采用WAL(write ahead log)的形式,先寫log,后寫數(shù)據(jù)。HBase是一個(gè)append類型的數(shù)據(jù)庫(kù),沒(méi)有關(guān)系型數(shù)據(jù)庫(kù)那么復(fù)雜的操作,所以記錄HLog的操作都是簡(jiǎn)單的 put操作(delete/update操作都被轉(zhuǎn)化為put進(jìn)行)
?
HLog
?
HLog寫入
HLog是HBase實(shí)現(xiàn)WAL方式產(chǎn)生的日志信息,其內(nèi)部是一個(gè)簡(jiǎn)單的順序日志,每個(gè)RS上的region都共享一個(gè)HLog,所有對(duì)于該RS上的 region數(shù)據(jù)寫入都被記錄到該HLog中。HLog的主要作用就是在RS出現(xiàn)意外崩潰的時(shí)候,可以盡量多的恢復(fù)數(shù)據(jù),這里說(shuō)是盡量多,因?yàn)樵谝话闱闆r 下,客戶端為了提高性能,會(huì)把HLog的auto flush關(guān)掉,這樣HLog日志的落盤全靠操作系統(tǒng)保證,如果出現(xiàn)意外崩潰,短時(shí)間內(nèi)沒(méi)有被fsync的日志會(huì)被丟失。
?
HLog過(guò)期
HLog的大量寫入會(huì)造成HLog占用存儲(chǔ)空間會(huì)越來(lái)越大,HBase通過(guò)HLog過(guò)期的方式進(jìn)行HLog的清理,每個(gè)RS內(nèi)部都有一個(gè)HLog監(jiān)控線程在運(yùn)行,其周期可以通過(guò)hbase.master.cleaner.interval進(jìn)行配置。
HLog在數(shù)據(jù)從memstore flush到底層存儲(chǔ)上后,說(shuō)明該段HLog已經(jīng)不再被需要,就會(huì)被移動(dòng)到.oldlogs這個(gè)目錄下,HLog監(jiān)控線程監(jiān)控該目錄下的HLog,當(dāng)該文 件夾下的HLog達(dá)到hbase.master.logcleaner.ttl設(shè)置的過(guò)期條件后,監(jiān)控線程立即刪除過(guò)期的HLog。
?
Memstore
?
數(shù)據(jù)存儲(chǔ)
memstore是region內(nèi)部緩存,其大小通過(guò)HBase參數(shù)hbase.hregion.memstore.flush.size進(jìn)行配 置。RS在寫完HLog以后,數(shù)據(jù)寫入的下一個(gè)目標(biāo)就是region的memstore,memstore在HBase內(nèi)部通過(guò)LSM-tree結(jié)構(gòu)組 織,所以能夠合并大量對(duì)于相同rowkey上的更新操作。
正是由于memstore的存在,HBase的數(shù)據(jù)寫入都是異步的,而且性能非常不錯(cuò),寫入到memstore后,該次寫入請(qǐng)求就可以被返 回,HBase即認(rèn)為該次數(shù)據(jù)寫入成功。這里有一點(diǎn)需要說(shuō)明,寫入到memstore中的數(shù)據(jù)都是預(yù)先按照rowkey的值進(jìn)行排序的,這樣有利于后續(xù)數(shù) 據(jù)查找。
?
數(shù)據(jù)刷盤
Memstore中的數(shù)據(jù)在一定條件下會(huì)進(jìn)行刷寫操作,使數(shù)據(jù)持久化到相應(yīng)的存儲(chǔ)設(shè)備上,觸發(fā)memstore刷盤的操作有多種不同的方式如下圖:
?
?
以上1,2,3都可以觸發(fā)memstore的flush操作,但是實(shí)現(xiàn)的方式不同:
?
- 1通過(guò)全局內(nèi)存控制,觸發(fā)memstore刷盤操作。
在該種情況下,RS中所有region的memstore內(nèi)存占用都沒(méi)達(dá)到刷盤條件,但整體的內(nèi)存消耗已經(jīng)到一個(gè)非常危險(xiǎn)的范圍,如果持續(xù)下去,很有可能造成RS的OOM,這個(gè)時(shí)候,需要進(jìn)行memstore的刷盤,從而釋放內(nèi)存。
memstore整體內(nèi)存占用上限通過(guò)參數(shù)hbase.regionserver.global.memstore.upperLimit進(jìn)行設(shè) 置,當(dāng)然在達(dá)到上限后,memstore的刷寫也不是一直進(jìn)行,在內(nèi)存下降到 hbase.regionserver.global.memstore.lowerLimit配置的值后,即停止memstore的刷盤操作。這樣做, 主要是為了防止長(zhǎng)時(shí)間的memstore刷盤,會(huì)影響整體的性能。
?
- 2手動(dòng)觸發(fā)memstore刷盤操作
HBase提供API接口,運(yùn)行通過(guò)外部調(diào)用進(jìn)行memstore的刷盤
- 3 memstore上限觸發(fā)數(shù)據(jù)刷盤
前面提到memstore的大小通過(guò)hbase.hregion.memstore.flush.size進(jìn)行設(shè)置,當(dāng)region中memstore的數(shù)據(jù)量達(dá)到該值時(shí),會(huì)自動(dòng)觸發(fā)memstore的刷盤操作。
?
刷盤影響
memstore在不同的條件下會(huì)觸發(fā)數(shù)據(jù)刷盤,那么整個(gè)數(shù)據(jù)在刷盤過(guò)程中,對(duì)region的數(shù)據(jù)寫入等有什么影響?
memstore的數(shù)據(jù)刷盤,對(duì)region的直接影響就是:在數(shù)據(jù)刷盤開(kāi)始到結(jié)束這段時(shí)間內(nèi),該region上的訪問(wèn)都是被拒絕的,這里主要是因 為在數(shù)據(jù)刷盤結(jié)束時(shí),RS會(huì)對(duì)改region做一個(gè)snapshot,同時(shí)HLog做一個(gè)checkpoint操作,通知ZK哪些HLog可以被移 到.oldlogs下。從前面圖上也可以看到,在memstore寫盤開(kāi)始,相應(yīng)region會(huì)被加上UpdateLock鎖,寫盤結(jié)束后該鎖被釋放。
?
StoreFile
?
memstore在觸發(fā)刷盤操作后會(huì)被寫入底層存儲(chǔ),每次memstore的刷盤就會(huì)相應(yīng)生成一個(gè)存儲(chǔ)文件HFile,storeFile即HFile在HBase層的輕量級(jí)分裝。
數(shù)據(jù)量的持續(xù)寫入,造成memstore的頻繁flush,每次flush都會(huì)產(chǎn)生一個(gè)HFile,這樣底層存儲(chǔ)設(shè)備上的HFile文件數(shù)量將會(huì)越 來(lái)越多。不管是HDFS還是Linux下常用的文件系統(tǒng)如Ext4、XFS等,對(duì)小而多的文件上的管理都沒(méi)有大文件來(lái)的有效,比如小文件打開(kāi)需要消耗更多 的文件句柄;在大量小文件中進(jìn)行指定rowkey數(shù)據(jù)的查詢性能沒(méi)有在少量大文件中查詢來(lái)的快等等。
?
Compact
大量HFile的產(chǎn)生,會(huì)消耗更多的文件句柄,同時(shí)會(huì)造成RS在數(shù)據(jù)查詢等的效率大幅度下降,HBase為解決這個(gè)問(wèn)題,引入了compact操作,RS通過(guò)compact把大量小的HFile進(jìn)行文件合并,生成大的HFile文件。
RS上的compact根據(jù)功能的不同,可以分為兩種不同類型,即:minor compact和major compact。
?
- Minor Compact
minor compact又叫small compact,在RS運(yùn)行過(guò)程中會(huì)頻繁進(jìn)行,主要通過(guò)參數(shù)hbase.hstore.compactionThreshold進(jìn)行控制,該參數(shù)配置了 HFile數(shù)量在滿足該值時(shí),進(jìn)行minor compact,minor compact只選取region下部分HFile進(jìn)行compact操作,并且選取的HFile大小不能超過(guò) hbase.hregion.max.filesize參數(shù)設(shè)置。
?
- Major Compact
相反major compact也被稱之為large compact,major compact會(huì)對(duì)整個(gè)region下相同列簇的所有HFile進(jìn)行compact,也就是說(shuō)major compact結(jié)束后,同一個(gè)列簇下的HFile會(huì)被合并成一個(gè)。major compact是一個(gè)比較長(zhǎng)的過(guò)程,對(duì)底層I/O的壓力相對(duì)較大。
major compact除了合并HFile外,另外一個(gè)重要功能就是清理過(guò)期或者被刪除的數(shù)據(jù)。前面提到過(guò),HBase的delete操作也是通過(guò)append的 方式寫入,一旦某些數(shù)據(jù)在HBase內(nèi)部被刪除了,在內(nèi)部只是被簡(jiǎn)單標(biāo)記為刪除,真正在存儲(chǔ)層面沒(méi)有進(jìn)行數(shù)據(jù)清理,只有通過(guò)major compact對(duì)HFile進(jìn)行重組時(shí),被標(biāo)記為刪除的數(shù)據(jù)才能被真正的清理。
compact操作都有特定的線程進(jìn)行,一般情況下不會(huì)影響RS上數(shù)據(jù)寫入的性能,當(dāng)然也有例外:在compact操作速度跟不上region中 HFile增長(zhǎng)速度時(shí),為了安全考慮,RS會(huì)在HFile達(dá)到一定數(shù)量時(shí),對(duì)寫入進(jìn)行鎖定操作,直到HFile通過(guò)compact降到一定的范圍內(nèi)才釋放 鎖。
?
Split
compact將多個(gè)HFile合并單個(gè)HFile文件,隨著數(shù)據(jù)量的不斷寫入,單個(gè)HFile也會(huì)越來(lái)越大,大量小的HFile會(huì)影響數(shù)據(jù)查詢性 能,大的HFile也會(huì),HFile越大,相對(duì)的在HFile中搜索的指定rowkey的數(shù)據(jù)花的時(shí)間也就越長(zhǎng),HBase同樣提供了region的 split方案來(lái)解決大的HFile造成數(shù)據(jù)查詢時(shí)間過(guò)長(zhǎng)問(wèn)題。
?
一個(gè)較大的region通過(guò)split操作,會(huì)生成兩個(gè)小的region,稱之為Daughter,一般Daughter中的數(shù)據(jù)是根據(jù)rowkey的之間點(diǎn)進(jìn)行切分的,region的split過(guò)程大致如下圖:
?
?
?
上面1 ~ 9就是region split的整個(gè)過(guò)程,split過(guò)程非常快,速度基本會(huì)在秒級(jí)內(nèi),那么在這么快的時(shí)間內(nèi),region中的數(shù)據(jù)怎么被重新組織的?
?
其實(shí),split只是簡(jiǎn)單的把region從邏輯上劃分成兩個(gè),并沒(méi)有涉及到底層數(shù)據(jù)的重組,split完成后,Parent region并沒(méi)有被銷毀,只是被做下線處理,不再對(duì)外部提供服務(wù)。而新產(chǎn)生的region Daughter A和Daughter B,內(nèi)部的數(shù)據(jù)只是簡(jiǎn)單的到Parent region數(shù)據(jù)的索引,Parent region數(shù)據(jù)的清理在Daughter A和Daughter B進(jìn)行major compact以后,發(fā)現(xiàn)已經(jīng)沒(méi)有到其內(nèi)部數(shù)據(jù)的索引后,Parent region才會(huì)被真正的清理。
?
HBase設(shè)計(jì)
?
HBase是一個(gè)分布式數(shù)據(jù)庫(kù),其性能的好壞主要取決于內(nèi)部表的設(shè)計(jì)和資源的分配是否合理。
?
表的設(shè)計(jì)
Rowkey設(shè)計(jì)
rowkey是HBase實(shí)現(xiàn)分布式的基礎(chǔ),HBase通過(guò)rowkey范圍劃分不同的region,分布式系統(tǒng)的基本要求就是在任何時(shí)候,系統(tǒng)的 訪問(wèn)都不要出現(xiàn)明顯的熱點(diǎn)現(xiàn)象,所以rowkey的設(shè)計(jì)至關(guān)重要,一般我們建議rowkey的開(kāi)始部分以hash或者M(jìn)D5進(jìn)行散列,盡量做到 rowkey的頭部是均勻分布的。禁止采用時(shí)間、用戶id等明顯有分段現(xiàn)象的標(biāo)志直接當(dāng)作rowkey來(lái)使用。
?
列簇設(shè)計(jì)
HBase的表設(shè)計(jì)時(shí),根據(jù)不同需求有不同選擇,需要做在線查詢的數(shù)據(jù)表,盡量不要設(shè)計(jì)多個(gè)列簇,我們知道,不同的列簇在存儲(chǔ)上是被分開(kāi)的,多列簇設(shè)計(jì)會(huì)造成在數(shù)據(jù)查詢的時(shí)候讀取更多的文件,從而消耗更多的I/O。
?
TTL設(shè)計(jì)
選擇合適的數(shù)據(jù)過(guò)期時(shí)間也是表設(shè)計(jì)中需要注意的一點(diǎn),HBase中允許列簇定義數(shù)據(jù)過(guò)期時(shí)間,數(shù)據(jù)一旦超過(guò)過(guò)期時(shí)間,可以被major compact進(jìn)行清理。大量無(wú)用歷史數(shù)據(jù)的殘余,會(huì)造成region體積增大,影響查詢效率。
?
Region設(shè)計(jì)
?
一般地,region不宜設(shè)計(jì)成很大,除非應(yīng)用對(duì)階段性性能要求很多,但是在將來(lái)運(yùn)行一段時(shí)間可以接受停服處理。region過(guò)大會(huì)導(dǎo)致major compact調(diào)用的周期變長(zhǎng),而單次major compact的時(shí)間也相應(yīng)變長(zhǎng)。major compact對(duì)底層I/O會(huì)造成壓力,長(zhǎng)時(shí)間的compact操作可能會(huì)影響數(shù)據(jù)的flush,compact的周期變長(zhǎng)會(huì)導(dǎo)致許多刪除或者過(guò)期的數(shù)據(jù) 不能被及時(shí)清理,對(duì)數(shù)據(jù)的讀取速度等都有影響。
?
相反,小的region意味著major compact會(huì)相對(duì)頻繁,但是由于region比較小,major compact的相對(duì)時(shí)間較快,而且相對(duì)較多的major compact操作,會(huì)加速過(guò)期數(shù)據(jù)的清理。
?
當(dāng)然,小region的設(shè)計(jì)意味著更多的region split風(fēng)險(xiǎn),region容量過(guò)小,在數(shù)據(jù)量達(dá)到上限后,region需要進(jìn)行split來(lái)拆分,其實(shí)split操作在整個(gè)HBase運(yùn)行過(guò)程中,是 被不怎么希望出現(xiàn)的,因?yàn)橐坏┌l(fā)生split,涉及到數(shù)據(jù)的重組,region的再分配等一系列問(wèn)題。所以我們?cè)谠O(shè)計(jì)之初就需要考慮到這些問(wèn)題,盡量避免 region的運(yùn)行過(guò)程中發(fā)生split。
?
HBase可以通過(guò)在表創(chuàng)建的時(shí)候進(jìn)行region的預(yù)分配來(lái)解決運(yùn)行過(guò)程中region的split產(chǎn)生,在表設(shè)計(jì)的時(shí)候,預(yù)先分配足夠多的 region數(shù),在region達(dá)到上限前,至少有部分?jǐn)?shù)據(jù)會(huì)過(guò)期,通過(guò)major compact進(jìn)行清理后, region的數(shù)據(jù)量始終維持在一個(gè)平衡狀態(tài)。
?
region數(shù)量的設(shè)計(jì)還需要考慮內(nèi)存上的限制,通過(guò)前面的介紹我們知道每個(gè)region都有memstore,memstore的數(shù)量與region數(shù)量和region下列簇的數(shù)量成正比:
?
一個(gè)RS下memstore內(nèi)存消耗:
?
Memory = memstore大小 * region數(shù)量 * 列簇?cái)?shù)量
?
如果不進(jìn)行前期數(shù)據(jù)量估算和region的預(yù)分配,通過(guò)不斷的split產(chǎn)生新的region,容易導(dǎo)致因?yàn)閮?nèi)存不足而出現(xiàn)OOM現(xiàn)象。
?
參考
http://blog.csdn.net/yangjinming24/article/details/51918132
http://blog.csdn.net/woshiwanxin102213/article/details/17584043
http://blog.csdn.net/FrankieWang008/article/details/41965543
http://lxw1234.com/archives/2016/09/719.htm
?
轉(zhuǎn)載于:https://www.cnblogs.com/ITtangtang/p/8137016.html
總結(jié)
以上是生活随笔為你收集整理的Hbase:原理和设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PAT 1057. 数零壹
- 下一篇: bzoj [Scoi2016]美味