HBase源码:HRegionServer启动过程

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

版本:HBase 0.94.15-cdh4.7.0

关于HMaster启动过程,请参考HBase源码:HMaster启动过程。先启动了HMaster之后,再启动HRegionServer。

运行HRegionServerStarter类启动HRegionServer:

package my.test.start;

import org.apache.hadoop.hbase.regionserver.HRegionServer;

public class HRegionServerStarter {

    public static void main(String[] args) throws Exception {
        //new HMasterStarter.ZookeeperThread().start();

        HRegionServer.main(new String[] { "start" });
    }

}

同样参考HBase源码:HMaster启动过程,运行HRegionServer.main方法,会通过反射创建一个HRegionServer实例,然后调用其run方法。

HRegionServer类继承关系如下:

构造方法

主要包括:

  • 设置服务端HConnection重试次数
  • 检查压缩编码,通过hbase.regionserver.codecs可以配置编码类,一一检测,判断是否支持其压缩算法。
  • 获取useHBaseChecksum值,是否开启hbase checksum校验
  • 获取hbase.regionserver.separate.hlog.for.meta参数值
  • 获取客户端重复次数
  • 获取threadWakeFrequency值
  • 获取hbase.regionserver.msginterval
  • 创建Sleeper对象,用于周期性休眠线程
  • 获取最大扫描结果集大小,hbase.client.scanner.max.result.size,默认无穷大
  • 获取hbase.regionserver.numregionstoreport
  • 获取rpctimeout值,hbase.rpc.timeout,默认60000
  • 获取主机名和绑定的ip和端口,端口默认为60020
  • 创建rpcServer
  • zk授权登录和hbase授权
  • 创建RegionServerAccounting
  • 创建CacheConfig

run方法

  • preRegistrationInitialization
    • initializeZooKeeper,此方法不会创建任何节点 - 创建ZooKeeperWatcher - 创建MasterAddressTracker 并等到”/hbase/master”节点有数据为止 - 创建ClusterStatusTracker 并等到”/hbase/shutdown”节点有数据为止 - 创建CatalogTracker 不做任何等待 - 创建RegionServerSnapshotManager
    • 设置集群id
    • 初始化线程:initializeThreads - 创建 cacheFlusher - 创建 compactSplitThread - 创建 compactionChecker - 创建 periodicFlusher - 创建 healthCheckChore - 创建 Leases - 判断是否启动 HRegionThriftServer
    • 参数hbase.regionserver.nbreservationblocks默认为4,默认会预留20M(每个5M,20M = 4*5M)的内存防止OOM
    • 初始化rpcEngine = HBaseRPC.getProtocolEngine(conf)
  • reportForDuty,轮询,向汇报master自己已经启动
    • getMaster(),取出”/hbase/master”节点中的数据,构造一个master的ServerName,然后基于此生成一个HMasterRegionInterface接口的代理,此代理用于调用master的方法
    • regionServerStartup
  • 当轮询结果不为空时,调用handleReportForDutyResponse - regionServerStartup会返回来一个MapWritable,这个MapWritable有三个值,这三个key的值会覆盖rs原有的conf: - “hbase.regionserver.hostname.seen.by.master” = master为rs重新定义的hostname(通常跟rs的InetSocketAddress.getHostName一样)rs会用它重新得到serverNameFromMasterPOV - “fs.default.name” = “file:///” - “hbase.rootdir” = “file:///E:/hbase/tmp” - 查看conf中是否有”mapred.task.id”,没有就自动设一个(格式: “hb_rs_“+serverNameFromMasterPOV),例如: hb_rs_localhost,60050,1323525314060 - createMyEphemeralNode:在zk中建立 短暂节点”/hbase/rs/localhost,60050,1323525314060”,也就是把当前rs的serverNameFromMasterPOV(为null的话用rs的InetSocketAddress、port、startcode构建新的ServerName)放到/hbase/rs节点下,”/hbase/rs/localhost,60050,1323525314060”节点没有数据 - 设置fs.defaultFS值为hbase.rootdir的值 - 生成一个只读的FSTableDescriptors - 调用setupWALAndReplication - 初始化 hlog、metrics、dynamicMetrics、rsHost - 调用startServiceThreads启动服务线程 - 启动一些ExecutorService - 启动hlogRoller - 启动cacheFlusher - 启动compactionChecker - 启动healthCheckChore - 启动periodicFlusher - leases.start() - 启动jetty的infoServer,默认端口为60030 - 启动复制相关打的一些handler:replicationSourceHandler、replicationSourceHandler、replicationSinkHandler - rpcServer启动 - 创建并启动SplitLogWorker
  • registerMBean
  • snapshotManager启动快照服务
  • 在master上注册之后,进入运行模式,周期性(msgInterval默认3妙)调用doMetrics,tryRegionServerReport
    • isHealthy健康检查,只要Leases、MemStoreFlusher、LogRoller、periodicFlusher、CompactionChecker有一个线程退出,rs就停止
    • doMetrics
    • tryRegionServerReport向master汇报rs的负载HServerLoad
  • shutdown之后的一些操作
    • unregisterMBean - 停掉thriftServer、leases、rpcServer、splitLogWorker、infoServer、cacheConfig
      • 中断一些线程:cacheFlusher、compactSplitThread、hlogRoller、metaHLogRoller、compactionChecker、healthCheckChore
    • 停掉napshotManager
    • 停掉 catalogTracker、compactSplitThread
    • 等待所有region关闭
    • 关闭wal
    • 删除zk上的一些临时节点,zooKeeper关闭

总结一下,HRegionServer主要干以下事情:

  • 在zk上注册自己,表明自己上线了
  • 跟master汇报
  • 设置wal和复制
  • 注册协作器RegionServerCoprocessorHost
  • 启动hlogRoller
  • 定期刷新memstore
  • 定期检测是否需要压缩合并
  • 启动租约
  • 启动jetty的infoserver
  • 创建SplitLogWorker,用于拆分HLog
  • 快照管理

总结

HRegionServer类中创建了一些对象:

  • HBaseServer:处理客户端请求
  • Leases:租约
  • InfoServer:Jetty服务器
  • RegionServerMetrics:
  • RegionServerDynamicMetrics:
  • CompactSplitThread:合并文件线程
  • MemStoreFlusher:刷新memstore线程
  • 两个Chore:compactionChecker、periodicFlusher
  • 两个LogRoller:hlogRoller、metaHLogRoller
  • MasterAddressTracker:跟踪master地址
  • CatalogTracker:跟踪-ROOT-和.META.表
  • ClusterStatusTracker:跟踪集群状态
  • SplitLogWorker:拆分log
  • Sleeper:
  • ExecutorService:
  • ReplicationSourceService和ReplicationSinkService:复制服务
  • RegionServerAccounting:
  • CacheConfig:缓存配置和block
  • RegionServerCoprocessorHost:RegionServer协作器
  • HealthCheckChore:健康检查
相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
分布式计算 安全 Hadoop
HBase启动时有进程webUI不显示HRegionServer各种情况解决方案
HBase启动时有进程webUI不显示HRegionServer各种情况解决方案
340 0
|
14天前
|
存储 分布式计算 Hadoop
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
34 2
|
5月前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List<Put>`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
50 3
实现HBase表和RDB表的转化(附Java源码资源)
|
分布式数据库 Hbase
hbase启动后没有hregionserver
hbase启动后没有hregionserver
hbase启动后没有hregionserver
|
分布式数据库 Hbase
|
分布式数据库 Hbase
HBase 源码解析
HBase Read读流程源码解析&HBase Write写流程源码解析 &HBase Flush & Compact流程源码解析
4668 0
|
Java 分布式数据库 Ruby
HBase Filter 过滤器之 Comparator 原理及源码学习
HBase所有的比较器实现类都继承于父类ByteArrayComparable,而ByteArrayComparable又实现了Comparable接口;不同功能的比较器差别在于对父类compareTo()方法的重写逻辑不同。 下面分别对HBase Filter默认实现的七大比较器一一进行介绍。 1. BinaryComparator 介绍:二进制比较器,用于按字典顺序比较指定字节数组。 先看一个小例子: public class BinaryComparatorDemo { public static void main(String[] args) {
485 0
|
Java
hbase源码系列(十四)Compact和Split
本文介绍hbase中的Compact和Split。
4091 0
|
分布式数据库 Hbase 分布式计算
hbase源码系列(十五)终结篇&Scan续集-->如何查询出来下一个KeyValue
这是这个系列的最后一篇了,实在没精力写了,本来还想写一下hbck的,这个东西很常用,当hbase的Meta表出现错误的时候,它能够帮助我们进行修复,无奈看到3000多行的代码时,退却了,原谅我这点自私的想法吧。
3412 0
|
缓存 固态存储 分布式数据库
hbase源码系列(十三)缓存机制MemStore与Block Cache
这一章讲hbase的缓存机制,这里面涉及的内容也是比较多,呵呵,我理解中的缓存是保存在内存中的特定的便于检索的数据结构就是缓存。
3020 0

相关实验场景

更多