? ? ? 按照總體計(jì)劃藏雏,這次來看看Master的啟動(dòng)以及運(yùn)行過程望浩,hbase的版本還是1.0.0响驴。
? ? ? 首先通常hbase集群中會(huì)有兩種HMaster琼梆,一個(gè)active master,以及多個(gè)backup master捌臊,分別通過hbase-daemon.sh start master以及hbase-daemon.sh start master --backup啟動(dòng)杨蛋。關(guān)于shell腳本的分析可以參考以前寫的regionserver的啟動(dòng)過程(http://www.reibang.com/p/20d79c4170ec),這里就不詳細(xì)講了。
一逞力、創(chuàng)建HMaster的準(zhǔn)備工作
? ? ? 無論是active還是standby曙寡,最后都是通過執(zhí)行org.apache.hadoop.hbase.master.HMaster的主函數(shù)來啟動(dòng)master的。
? ? ? 關(guān)于HBase中進(jìn)程的啟動(dòng)寇荧,代碼做了很多包裝举庶,上次regionserver沒有詳細(xì)講,放到這里的HMaster來講揩抡,下面是相關(guān)類的類圖户侥。
? ? ? HMaster中main函數(shù)調(diào)用的doMain方法是在ServerCommandLine中實(shí)現(xiàn)的,這個(gè)類主要讀取了hbase的一些配置文件峦嗤,并且啟動(dòng)對(duì)應(yīng)的進(jìn)程蕊唐,相關(guān)代碼如下所示:
? ? ? Tool接口中的run方法則是在HMasterCommandLine中實(shí)現(xiàn)的,這里會(huì)判斷是否啟動(dòng)backup master烁设,修改相關(guān)配置替梨;然后再根據(jù)傳入的參數(shù)確定是start還是stop,還有一個(gè)clear貌似跟zookeeper相關(guān)署尤,還不是很懂耙替,以后再看亚侠。
? ? ? 在startMaster方法中,會(huì)根據(jù)配置判斷是本地模式還是分布式硝烂,前者不常用就不說了箕别,后者則會(huì)動(dòng)過HMaster的constructMaster方法、利用反射機(jī)制滞谢,獲取構(gòu)造函數(shù)串稀,然后再創(chuàng)建HMaster實(shí)例。
二狮杨、HMaster的構(gòu)造方法
? ? ? 如同第一部分的UML類圖所示母截,在HBase1.0.0版本中,HMaster繼承自HRegionServer橄教,而且兩者RPC服務(wù)堅(jiān)挺的端口都是由hbase.regionserver.port參數(shù)指定清寇,所以不能像以前那樣可以在同一臺(tái)主機(jī)上啟動(dòng)HMaster以及HRegionServer兩個(gè)服務(wù)了。
? ? 但是由于兩個(gè)RPC類監(jiān)聽的協(xié)議不同(MasterRpcServices通過重寫getServices方法實(shí)現(xiàn))华烟,所以兩者處理不同的RPC請(qǐng)求。下面分別是RSRpcServices中構(gòu)造RPC服務(wù)的代碼持灰、RSRpcServices中g(shù)etServices方法的代碼以及MasterRpcServices中g(shù)etServices的方法代碼盔夜。
? ? ? 這里有一點(diǎn)搞不懂,HMaster又不負(fù)責(zé)處理RegionServer的服務(wù),為什么RPC還要包括RegionServer的兩個(gè)RPC協(xié)議喂链,看以后會(huì)不會(huì)弄清楚點(diǎn)吧返十。
? ? ? 除了RPC服務(wù)之外,還可以根據(jù)配置衩藤,看是否需要將集群狀態(tài)實(shí)時(shí)發(fā)送給客戶端吧慢。
? ? ? 最后實(shí)例化了activeMasterManager,對(duì)象用于master之間選舉active的選舉并且讓backup master循環(huán)等待成為active的master赏表。
三检诗、ActiveMaster的后續(xù)初始化
? ? ? 當(dāng)active master確認(rèn)前面兩個(gè)步驟執(zhí)行完成之后,還需要進(jìn)行一系列的其他初始化工作瓢剿,集中在finishActiveMasterInitialization方法中逢慌。
? ? ? 在該方法中,首先開啟一個(gè)線程zombieDetector间狂,確保active HMaster的初始化工作需要在“hbase.master.initializationmonitor.timeout”配置內(nèi)完成攻泼,否則初始化失敗。
? ? ? 總體初始化的過程比較簡(jiǎn)單鉴象,主要包括以下過程:
? ? ? 1.啟動(dòng)一些該啟動(dòng)的線程例如平衡線程忙菠、集群狀態(tài)監(jiān)控線程等等;
? ? ? 2.等待hbase.master.wait.on.regionservers.mintostart個(gè)regionserver啟動(dòng)纺弊;
? ? ? 3.分配hbase:meta這張表的region牛欢,在老的版本里面,定位服務(wù)涉及到root以及meta兩張表淆游;但是新版本(從0.96開始)里面已經(jīng)沒有root表了傍睹,hbase:meta表也只有一個(gè)region不能split。雖然沒有root表會(huì)影響集群整體容量犹菱,但是大多數(shù)情況下只要hbase:meta表也就夠了拾稳,實(shí)在不行可以把region調(diào)整大一些。
? ? ? 最后推薦一篇文章http://www.blogjava.net/DLevin/archive/2015/08/22/426877.html腊脱,這個(gè)主要是講的hbase的體系結(jié)構(gòu)访得,也涉及到了比較新的版本,大家可以看看陕凹。