您好,登錄后才能下訂單哦!
很多細節不便在本篇寫的過于詳細,等后續細節分析
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進行處理
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啟動
1.2.16 執行postCP post Master startup
1.3 啟動Stop Check Thread,每秒檢查一次
完畢
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。