HBase學習 - HRegionServer啟動

本文基于hbase-1.3.0源碼

1. 前言

本文主要介紹hbase里region server的創建和啟動過程中所做的工作,是一個純粹的記錄性工作。

2. HRegionServer啟動過程

HRegionServer和HMaster是hbase集群里兩個主要角色,類HRegionServer帶有main方法,可以通過命令行啟動。main方法通過new HRegionServerCommandLine(regionServerClass).doMain(args); 首先創建HRegionServer實例,然后調用其start完成啟動。此外還實現Runnable接口,start方法調用run運行HRegionServer。下面主要講述調用構造函數的過程,以及run所做的工作。

2.1 HRegionServer的構造方法

構造方法原型如下:

public HRegionServer(Configuration conf, CoordinatedStateManager csm){...}
參數:

  1. conf即配置信息, 即hbase-default.xmlhbase-site.xml內容

  2. csm,分布式環境下用來協調集群所有server的狀態信息的,可以看看CoordinatedStateManager的繼承結構以及主要方法:

    CoordinatedStateManager 
            ^
            |
    BaseCoordinatedStateManager 
            ^
            |
    ZkCoordinatedStateManager
      
    下面是ZkCoordinatedStateManager的主要成員:
      protected ZooKeeperWatcher watcher;
      protected SplitTransactionCoordination splitTransactionCoordination;
      protected CloseRegionCoordination closeRegionCoordination;
      protected SplitLogWorkerCoordination splitLogWorkerCoordination;
      protected SplitLogManagerCoordination splitLogManagerCoordination;
      protected OpenRegionCoordination openRegionCoordination;
      protected RegionMergeCoordination regionMergeCoordination;
    

    主要是通過zookeeper來協調當前server上region的打開、關閉以及split或者merge等操作使得region狀態發生改變, 以便讓集群中其他的server包括master感知到當前server的狀態。具體的原理將在region open 、close、split、merge原理里單獨闡述。

2. HRegionServer啟動的服務

2.1 接口RegionServerServices

HRegionServer實現了接口RegionServerServices,接口方法定義了HRegionServer提供的部分服務(功能)

  1. WAL getWAL(HRegionInfo regionInfo) , WAL(Write Ahead Log),一般一個regionserver只有一個wal。
  2. CompactionRequestor getCompactionRequester(), 獲得負責HFile的compact的線程,實際返回的實現類CompactSplitThread負責compact和split兩項工作。
  3. FlushRequestor getFlushRequester(),獲得負責flush HMemStore的線程
  4. TableLockManager getTableLockManager(),基于zk實現的分布式的鎖管理器,用來鎖表的
  5. RegionServerQuotaManager getRegionServerQuotaManager(),資源配額管理器,可以基于user、table以及namespace粒度設置
  6. Leases getLeases(),實現了基于租約的機制, 這個返回的是一個lease管理器。
  7. ExecutorService getExecutorService(),ExecutorServices是一組線程池組成,這個不是jdk里的ExecutorService。HRegionServer上按照任務種類的不同(比如close region,split region等等)創建多個線程池(Executor)的封裝,根據任務的種類將任務派發到不同的線程池執行。
  8. Set<TableName> getOnlineTables(), 獲取當前RegionSever上可用的table(RegionServer擁有的只是table的一個分片,即region)
  9. registerService(Service service), 注冊Endpoint類型的coprocessor。

2.1 構造函數中初始化服務

  1. 創建Rpc服務 - RSRpcServices

    rpc服務,HBase的rpc服務借助了protobuf實現。RSRpcServices主要實現了兩類rpc服務:

    • ClientService(定義在client.proto),主要client端的scan,put這種操作,還包括coprocessor操作
    • AdminService(定義在admin.proto),主要是region的操作(open, close, split, merge等)
  2. 創建文件系統 - HFileSystem

    封裝hadoop FileSystem, HFile、wal log等信息持久化在hdfs上

  3. 創建htable meta信息的幫助類實例 - FSTableDescriptors

    從FileSystem中獲取表的meta信息以及將meta信息寫到FileSystem

  4. 實例化 ExecutorService
    ExecutorService持有一系列根據名稱劃分的線程池,master和hregionserver啟動的服務不一樣,下面的枚舉了各自的服務:

public enum ExecutorType {

// Master executor services
MASTER_CLOSE_REGION        (1),
MASTER_OPEN_REGION         (2),
MASTER_SERVER_OPERATIONS   (3),
MASTER_TABLE_OPERATIONS    (4),
MASTER_RS_SHUTDOWN         (5),
MASTER_META_SERVER_OPERATIONS (6),
M_LOG_REPLAY_OPS           (7),

// RegionServer executor services
RS_OPEN_REGION             (20),
RS_OPEN_ROOT               (21),
RS_OPEN_META               (22),
RS_CLOSE_REGION            (23),
RS_CLOSE_ROOT              (24),
RS_CLOSE_META              (25),
RS_PARALLEL_SEEK           (26),
RS_LOG_REPLAY_OPS          (27),
RS_REGION_REPLICA_FLUSH_OPS  (28),
RS_COMPACTED_FILES_DISCHARGER (29),
RS_OPEN_PRIORITY_REGION    (30);

ExecutorType(int value) {}

/**
 * @param serverName
 * @return Conflation of the executor type and the passed servername.
 */
String getExecutorName(String serverName) {
  return this.toString() + "-" + serverName.replace("%", "%%");
}
}
  1. 初始化ZooKeeperWatcher,cluster環境下。諸如regionserver,metatable所在server地址,table locksplit/merge region等等信息都是通過zookeeper做全局狀態協調的。

    很多信息保存在zookeeper上,比如master地址;正在運行的region servers;全局的分布式table lock實現;正在recovering狀態的region servers等等

  2. 調用putUpWebUI,通過jetty提供給用戶通過web訪問region server的方式

    1. master提供web服務的host、port分別由hbase.master.info.bindAddresshbase.master.info.port,默認0.0.0.0:16010
    2. region server由hbase.regionserver.info.bindAddress, hbase.regionserver.info.port設置,默認0.0.0.0:16030
  3. 創建LogRoller

    LogRoller負責當前RegionServer上所有的wal的roll。LogRoller周期性的(由配置erver.logroll.period決定周期,默認1小時)或者收到某個特定的wal log的roll request觸發log roll。

  4. 創建ChoreService

    ChoreService內部封裝了scheduled executor線程池,負責周期性的調度一些任務,調度的對象需要實現接口ScheduleChore。其任務一般都是需要頻繁執行且執行時間不長,例如:

    • 心跳檢測

    • 已經compacted 的HFile的清理

    • 定期檢查是否需要compact

    • 垃圾文件清理等瑣碎而又頻繁的任務

2.2 HRegionServer start

  1. 調用preRegistrationInitialization在向HMaster注冊(所謂注冊并不是向HMaster發消息,而是在zookeeper的/hbase/rs路徑下創建包含當前region server信息的節點,HMaster監聽這個節點)之前完成一些初始化工作,主要包括:

    • 調用setupClusterConnection,創建ClusterConnection,這和client創建的到HRegionServer的connection是兩個東西。ClusterConnection是HRegionServer到HRegionServer或者HMaster的訪問

    • 健康檢查,如果配置了健康檢查(hbase.node.health.script.location配置不為空,),將創建HealthCheckChore定期做健康檢查,方式是執行location配置的位置的腳本來檢查當前HRegionServer的健康狀況。

    • 調用initializeZooKeeper,主要做兩件事:

      1. 等待master起來,也就是監控zookeeper的/hbase/master節點(這個節點的位置由zookeeper.znode.master配置)有數據(這個節點的數據由master設置為自己的host:port);

      2. 等待整個集群起來,默認監控/hbase/running節點(由zookeeper.znode.state配置),這個節點由master收集到各個region server狀態后設置成時間值。

    • 調用initializeThreads,會啟動很多服務線程池,在HRegionServer和運行期間提供服務,主要有:

      1. MemStoreFlusher,負責刷新region的memstore,MemStroeFlusher內部持有一些FlushHandler(持續運行的線程,個數由配置hbase.hstore.flusher.count指定,默認2個)來完成region的memstore的flush。

      2. CompactSplitThread,在它內部創建四個線程池分別負責region的minor compact, major compact,split和merge。

        1. 一個RegionServer擁有的region上限由hbase.regionserver.regionSplitLimit指定,默認1000
        2. major compact 線程數量由base.regionserver.thread.compaction.large指定,默認1
        3. minor compact線程數量由hbase.regionserver.thread.compaction.small指定,默認1
        4. split的線程數量由hbase.regionserver.thread.split指定,默認1
        5. merge線程的數量由hbase.regionserver.thread.merge指定,默認1
      3. CompactionChecker,周期性(周期由base.server.thread.wakefrequency指定,默認10000ms)的檢查所有region的所有HStore看看是否需要compaction,需要compact的將通知compactSplitThread完成。這是ScheduledChore的子類,因此會有ChoreService調度。

      4. PeriodicMemstoreFlusher,周期性檢查所有region的所有HMemStore是否需要flush。需要通知MemStoreFlusher完成。該類也是ScheduledChore的子類。

      5. Leases,相當于租約管理器,管理所有租約(Lease)的申請、續租以及租約到期。Leases實現HasThread,是一個持續運行的daemon線程,其運行期間,檢查所有lease,對于過期的lease,激活lease.getListener().leaseExpired()

      6. MovedRegionsCleaner, 清理已經移動到其他region server或者刪除掉的不在屬于當前region server管理的region。這也是一個ScheduledChore的子類

      7. RegionServerQuotaManager, 管理namespace,user,table粒度的quota。關于Quota的機制會在XXXX細講。

      8. 創建RpcClient,默認創建org.apache.hadoop.hbase.ipc.RpcClientImpl這個,這是直接使用java nio實現,可以通過hbase.rpc.client.impl配置修改rpcclient。

      9. 創建StorefileRefresherChore,繼承至ScheduledChore,負責當前HRegionServer里secondary region(replica id不為0)的HStore和primary region的同步的(primary region的write操作會導致hfile發生改變,secondary需要報primary保持同步)。同步周期由hbase.regionserver.storefile.refresh.period設置,0表示不同步。

      10. 調用registerConfigurationObservers,內部調用configurationManager

      的regist方法注冊一些需要在配置發送動態修改時一并修改內部狀態的服務,目前注冊了CompactSplitThread,RSRpcServices以及HRegionServer,也就是說和這些服務相關的配置改變時,可以動態的感知。

  2. 在zookeeper /hbase/rs路徑(子路徑rs由zookeeper.znode.rs設置)下創建當前regionserver名的節點,

  3. 創建RegionServerCoprocessorHost,創建時會根據用戶的配置文件選擇加載的coprocessor,CoprocessorHost提供coprocessor的執行環境,除了RegionServerCoprocessorHost,還有RegionCoprocessorHost,WALCoprocessorHost,區別以及細節將在xxxx中詳解。RegionServer這一級容許coprocessor在region merge以及region server關閉前后做一些工作。

    1. 這一級的coprocessor通過hbase.coprocessor.enabled啟用;
    2. 配置hbase.coprocessor.regionserver.classes,設置為默認加載的coprocessor,使用,分割類。
  4. 調用reportForDuty()通知master,region server啟動成功

    1. 在成功返回后創建WALFactory實例,啟動各種服務線程(前面提到的ExecutorService)、各種前面提到的chore service、集群間復制service()堆內存管理器等等。
    2. 通過設置base.replication為true啟動集群間wal log同步,默認為true。

以上,HRegiongServer完成啟動。

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容