3.HRegionServer:管理regions,并向HMaster报告自己状态
3.1 regionserver启动过程
(1)读取一些配置:机器名,端口,客户端重试次数,与master交互间隔,rpc超时
(2)创建Worker线程处理来自master的请求(????)
(3)创建一个HBaseServer的实例提供IPC服务以处理Client的请求
(4)创建HServerInfo实例保持regionserver信息:地址,机器名,监听端口等
(5)创建Flush缓存的线程
(6)创建Compact和Split region的线程
(7)创建归档(roll)HLog的线程
(8)定期检查regions是否需要major compaction线程
(9)regionserver与外部client交互时,会申请一些资源,当外部client失败后需释放这些资源。创建Leases线程来处理这个任务。
(10)创建ZooKeeper实例,以连接zookeeper集群,并增加/hbase/master节点的Watcher
(11)申请一部分heap空间(4个byte数组,每个5M,共20M),保留下来,在发生OOME时再释放以从异常中恢复
(12)启动regionserver并安装shut down hooks(?????????)
3.2 HRegionServer.run()
(1)向master报告自己的状态:reportForDuty()方法
从zookeeper的/hbase/master节点获取master地址,通过HBaseRPC获得HMasterRegionInterface接口实现的代理;
从MemoryMXBean获取内存使用信息,计算其负载,并保存到HServerInfo实例中;
调用HMasterRegionInterface.regionServerStartup(),告诉master该regionserver已启动,
该接口返回一个MapWritable,包含hbase.regionserver.address,fs.default.name和hbase.rootdir等master配置信息,
以更新本地配置(HBASE-1215);
(2)启动一些服务线程
在文件系统根目录下.logs建立commit log HLog的实例;
后台启动归档(roll)HLog的线程,Flush缓存的线程,Compact和Split region的线程,来自master请求的worker线程,检查regions是否需要major compaction线程
启动Leases线程;
启动Jetty Server,处理http请求
(3)当服务线程正常运行(isAlive()),则在hbase.regionserver.msginterval间隔后与master交换信息:
收集regionserver的metrics,包括:HStore,HStoreFile,索引,所有region的内存大小,block缓存的命中率等信息,regionserver负载信息;
通过PRC向master发送信息HMsg,并返回master的指令,指令类型有:stop regionserver,停止服务用户regions,重启等