天天看點

HMaster啟動流程簡析

很多細節不便在本篇寫的過于詳細,等後續細節分析

0. 由HBaseCommandLine首先對HMaster進行初始化

0.1 檢查是否進行了IP綁定(https://issues.apache.org/jira/browse/HBASE-8148),擷取位址

0.2 通過HbaseRPC建立一個RPCServer

0.2.1 首先擷取RPCEngine(WritableRPCEngine),并通過其對RPCServer進初始化(Server:HBaseServer:RPCServer)

0.2.1.1 初始化CallQueue(ipc.server.max.queue.size:向後相容,ipc.server.max.callqueue.length,預設值為handler* DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER)和ReplicationQueue(ipc.server.max.callqueue.size,預設值為1024×1024×1024),以及SizeBasedThrottler(threshold=ipc.server.max.callqueue.size),Listener和Responder等

0.2.1.1.1初始化Responder,建立一個selector,其中頻率為purgeTimeout(預設值2×DEFAULT_HBASE_RPC_TIMEOUT)

0.2.1.1.2初始化Listener,擷取監聽位址并綁定到ServerSocket,其中backlog length= ipc.server.listen.queue.size,并初始化一個大小為ipc.server.read.threadpool.size的threadpool并對ipc.server.read.threadpool.size個Reader進行初始化并啟動,最後注冊連接配接事件;

0.3 對已經初始化完畢的RPCServer啟動

0.3.1 啟動Responder,從responseQueue取出response寫回,這裡Responder有一處類似HADOOP RPC的優化就是當responseQueue隻有一個值時立刻響應.

0.3.2 啟動Listener:每10秒并且連接配接數超過ipc.client.idlethreshold則對ConnectionList進行一次檢查,若逾時2×ipc.client.connection.maxidletime,則進行清理,最多清理ipc.client.kill.max(預設10個)

0.3.3 啟動Handler,從CallQueue取出Call對rpcserver調用,并将傳回值發送到responder進行處理

HMaster啟動流程簡析

0.4将HMaster傳入ZookeeperWatcher初始化

0.4.1 初始化ZookeeperWatcher:通過Zkutil或者一個Zookeeper Client對象,其中sessionTimeout=zookeeper.session.timeout(預設180s),maxretry=zookeeper.recovery.retry以及retryIntervalMillis=zookeeper.recovery.retry.intervalmill

0.4.1.1 進入到Zookeeper環節(下回分解)

0.5 初始化Health Check Thread,檢查頻率為hbase.node.health.script.frequency預設10秒

1.HMaster執行startup進行啟動流程

1.1 調用becomeActiveMaster,進入阻塞狀态直到Active

1.1.1 初始化ActiveMasterManager:ZookeeperListener

1.1.2 将zookeeperWatcher注冊到ActiveMasterManager來進行監聽

1.1.3 stallIfBackupMastes略過不表

1.1.4 初始化ClusterStatusTracker:ZookeeperNodeTracker,并啟動,注冊HMaster到ClusterStatusTracker上

1.1.5 blockUntilBecomingActiveMaster:Add a ZNode for ourselves in the backup master directory since we are notthe active master.If we become the active master later, ActiveMasterManagerwill delete this node explicitly. If wecrash before then, ZooKeeper will delete this node for us since it isephemeral.

1.2 調用finishInitialization進入初始化完成階段

1.2.1 初始化filesystemManager:MasterFileSystem

1.2.1.1 如果開啟hbase.master.distributed.log.splitting,則初始化SplitLogManager:ZookeeperListener

1.2.1.1.1

1.2.1.2 建立初始化目錄:檢查rootdir是否存在,檢查tempdir是否存在并清理,建立oldlogdir

1.2.2 初始化FSTableDescriptors->tableDescriptor

1.2.3 初始化ExecutorService

1.2.4 初始化ServerManager:其中是通過HConnectionManager擷取一個HConnection,其中連接配接池的大小為hbase.zookeeper.properties.maxClientCnXns(預設300)+1

1.2.5 初始化所有基于ZK的tracker:

1.2.5.1初始化CatalogTracker

1.2.5.1.1 擷取一個HConnection

1.2.5.1.2 初始化RootRegionTracker:ZookeeperNodeTracker(rootServerZnode)

1.2.5.1.3 初始化MetaRegionTracker:ZookeeperNodeTracker(assignmentnode/first_meta_region)

1.2.5.2 啟動CalalogTracker

1.2.5.2.1 啟動RootRegionTracker:開始track RR

1.2.5.2.2 啟動MetaRegionTracker: 開始trackMR

1.2.5.3 通過LoadBalancerFactory擷取balancer執行個體

1.2.5.4 初始化AssginmentManager,管理region的配置設定:包括初始化timeoutMonitor(hbase.master.assignment.timeoutmonitor.period預設10s,hbase.master.assignment.timeoutmonitor.timeout預設30min),timerUpdater(hbase.master.assignment.timerupdater.period預設10s)

1.2.5.5 将zookeeperWatcher注冊到assginmentManager,并加到ListenerList的第一位

1.2.5.6 初始化RegionServerTracker...

1.2.5.7 啟動RegionServerTracker...

1.2.5.8初始化DrainingServerTracker...

1.2.5.9 啟動DrainingServerTracker...

1.2.5.10初始化SnapshotManager...

1.2.7 初始化MasterCoprocessorHost

1.2.8 啟動服務線程:包括MASTER_OPEN_REGION(hbase.master.executor.openregion.threads,5),MASTER_CLOSE_REGION(hbase.master.executor.closeregion.threads,5),MASTER_SERVER_OPERATIONS(hbase.master.executor.serverops.threads,3),MASTER_META_SERVER_OPERATIONS(hbase.master.executor.serverops.threads,5),MASTER_TABLE_OPERATIONS;以及初始化并運作LogCleaner,HFileCleaner,最後啟動HealCheckChore,并且RPCServer開始接受請求

1.2.9 等待RS狀态彙報:等到以下三個條件滿足:

a.themaster is stopped

b.the'hbase.master.wait.on.regionservers.maxtostart' number of region servers is reached

c.the 'hbase.master.wait.on.regionservers.mintostart' is reached AND

there have been no new region serverin for 'hbase.master.wait.on.regionservers.interval預設1.5s' time AND

the'hbase.master.wait.on.regionservers.timeout預設4.5s'is reached

1.2.10 檢查哪些RS沒有注冊到ZK:将啟動的RS進行注冊并記錄到serverManager

1.2.11 啟動AssignManager:啟動TimeoutMonitor

1.2.12 進行一次splitlog操作:由MasterFileSystem進行,掃描hlogdir檢視其所屬regionserver是否online,如果不線上則加入到splitlogManager的deadWorkers清單并在Zk對所有的hlog在splitlog路徑下建立一個znode,等待其他RegionServer的SplitlogWorker擷取任務後進行處理(細節見下篇RegionServer啟動流程),若關閉hbase.master.distributed.log.splitting,則由HMaster處理,此處不表

1.2.13 配置設定ROOT和MATA region:檢查—ROOT—和.META.是否已經配置設定,若沒有則由AssignmentManager進行配置設定:

1.2.13.1

1.2.14 開啟shutdownHandler:由ServerManager對deadNotExpiredServers進行過期檢查,對expiredServer進行處理并送出關閉流程到ExecutorService

1.2.15 AssginmentManager 進行JoinCluster:将InDisablingState和EnabingState的表進行恢複

1.2.16 fix 子region

1.2.17 啟動Balancer并交由Chore每300s運作一次,并且是單線程運作:當Region正處于轉換或者RS正在下線則不進行balance;

1.2.18 startCatalogJanitorChore啟動

繼續閱讀