当前位置: 首页 > news >正文

HBase 源码阅读(二)

衔接

在上一篇文章中,HMasterCommandLine类中在startMaster();方法中

        // 这里除了启动HMaster之外,还启动一个HRegionServerLocalHBaseCluster cluster = new LocalHBaseCluster(conf, mastersCount, regionServersCount,LocalHMaster.class, HRegionServer.class);// 这里getMaster 会获取到HMaster吧((LocalHMaster)cluster.getMaster(0)).setZKCluster(zooKeeperCluster);cluster.startup();waitOnMasterThreads(cluster);

使用了 cluster.startup(); 对HBase的主要进程进行启动

  public void startup() throws IOException {JVMClusterUtil.startup(this.masterThreads, this.regionThreads);}

1. JVMClusterUtil.java

public static String startup(final List<JVMClusterUtil.MasterThread> masters,final List<JVMClusterUtil.RegionServerThread> regionservers) throws IOException

这个函数上面,显示完成了HMaster的线程初始化,然后等到HMaster的线程初始化后,又调用了HRegionServer的线程初始化,但我发现HMaster线程在执行完run方法后,在run方法最后还执行了一遍super.run(),HMaster多执行了一次HRegionServer.run方法的目的是为了?

ChatGPT回答的可能原因

  1. 继承自公共的父类
  • 在HBase的实现中,HMasterHRegionServer都可能继承自一个共同的父类或实现了相同的接口(例如ThreadRunnable接口),该父类可能定义了一个run()方法,用于执行一些通用的逻辑。
  • HMaster在执行自己的run()方法后调用super.run()时,它可能是在执行父类中的通用逻辑。这种逻辑可能与线程的基础设施或资源管理有关,而不仅仅是特定于HRegionServer的逻辑。
  1. HMasterHRegionServer共享某些功能
  • HMasterHRegionServer虽然在职责上不同,但它们可能共享某些基础功能,比如网络通信、线程管理、资源分配等。父类中的run()方法可能封装了这些通用功能,因此HMaster在完成自己的工作后,调用super.run()来确保这些共享功能得以执行。
  • 这可能解释了为什么在HMasterrun()方法之后还要调用super.run():这是为了确保即使是HMaster,也能够执行一些HRegionServerHMaster共享的初始化或管理任务。
  1. 确保线程生命周期的完整性
  • super.run()的调用可能是为了确保线程的生命周期管理符合预期。例如,在某些实现中,父类的run()方法可能会处理线程的启动、暂停、恢复、终止等状态。如果不调用super.run(),可能会导致线程的状态管理不完整或不正确。

经过在HRegionServer.run 方法print 测试发现,HRegionServer.run在HMaster启动时调用了一次,在HR egionServer 线程启动时又调用了一次

带着这三个内容,我们去看HMaster run方法之后的HRegionServer run方法

2. HMaster.run() 方法

  public void run() {try {//用于控制是否在本地测试时启动一个完整的HBase集群if (!conf.getBoolean("hbase.testing.nocluster", false)) {Threads.setDaemonThreadRunning(new Thread(() -> {try {// 定义端口int infoPort = putUpJettyServer();// 启动MasterManagerstartActiveMasterManager(infoPort);} catch (Throwable t) {// Make sure we log the exception.String error = "Failed to become Active Master";LOG.error(error, t);// Abort should have been called already.if (!isAborted()) {abort(error, t);}}}), getName() + ":becomeActiveMaster");}// Fall in here even if we have been aborted. Need to run the shutdown services and// the super run call will do this for us.super.run();

HMaster的接口只是调用了startActiveMasterManager(infoPort); 对Master的一些基础内容进行初始化(具体内容请看HBase源码阅读(一)),然后又调用了一次HRegionServer的run方法

3. HRegionServer run方法

  1. HMaster.java.,HMaster run()线程启动临近结束后,再调用HRegionServer进程

仔细看HRegionServer.run方法,主要涉及HRegionServer的运行和启动

所以上一章节中的问题应该是第二个选型

  1. HMasterHRegionServer共享某些功能

HMaster 比HRegionServer在HMaster.run中多了一些内容

  • HMasterHRegionServer虽然在职责上不同,但它们可能共享某些基础功能,比如网络通信、线程管理、资源分配等。父类中的run()方法可能封装了这些通用功能,因此HMaster在完成自己的工作后,调用super.run()来确保这些共享功能得以执行。
  • 这可能解释了为什么在HMasterrun()方法之后还要调用super.run():这是为了确保即使是HMaster,也能够执行一些HRegionServerHMaster共享的初始化或管理任务。

4. HRegionServer.handleReportForDutyResponse()

简单过一下,用来启动所有的服务器线程

  1. 设置hostname
  2. 在zookeeper中设置Znode
  3. 初始化文件系统
  4. 设置已经初始化的副本和WAL
  5. 设置线程名称
  6. 启动暂停监视器
  7. 启动复制服务(启动复制源和接收器处理程序。)
  8. log zk的信息,唤醒其他所有等待该RegionServer 启动的其他节点

3.1 暂停监视器

JvmPauseMonitor的作用和功能

  1. 监控JVM暂停事件:
    • JvmPauseMonitor通过定期检查系统时间的变化来判断是否发生了JVM暂停。它会设置一个定时器,每隔一段固定的时间去检测系统的时间戳。如果时间戳的变化超过预期值,这通常意味着JVM暂停事件发生了。
  2. 检测长时间的GC停顿:
    • JVM暂停最常见的原因之一是垃圾收集(GC),尤其是Full GC或长时间的Stop-the-World(STW)事件。JvmPauseMonitor可以帮助检测这些事件,因为它们可能会导致HBase的RegionServer或者HMaster的服务性能下降,甚至导致客户端请求超时。
  3. 日志记录和报警:
    • JvmPauseMonitor检测到异常的暂停(通常超过一定阈值,例如几百毫秒或更长),它会记录警告日志。日志中会包括暂停的时长、可能的原因等信息。这有助于运维人员监控和分析系统的性能问题,尤其是在垃圾回收引起的问题上。
  4. 提高系统可靠性:
    • 通过监控和记录JVM暂停,JvmPauseMonitor帮助识别出可能影响HBase性能的问题,允许系统管理员采取预防或修复措施。尽管JvmPauseMonitor本身不会直接解决这些问题,但它提供了有价值的诊断信息,帮助识别和缓解性能瓶颈。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java 根据给定的子网掩码和网关计算起始IP和结束IP
  • 网络层 III(划分子网和构造超网)【★★★★★★】
  • Spring 事务传播和自调用行为
  • python打包 exe 提示no module named flask
  • 【记忆回溯】【深度搜索】【动态规划】【字符串】【力扣】单词拆分
  • pandas操作Excel文件
  • react vant 在使用dialog.confirm取消报错 Uncaught (in promise) undefined
  • jQuery入门(七)jQuery实现按钮分页
  • 关于VUE3开发频繁引入ref,reactive,computed等基础函数。
  • c++ 标准模板库 STL
  • 运维问题0001:MM模块-MIGO收货报错“消息号 M7036 对于采购订单********无收货可能”
  • 【MySql】在Redis使用中,缓存不一致的夺命十八问!
  • 系统监控和命令行环境
  • 会赢的!(牛客)
  • python进阶篇-day04-闭包与装饰器
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【EOS】Cleos基础
  • 【node学习】协程
  • codis proxy处理流程
  • Effective Java 笔记(一)
  • IDEA常用插件整理
  • iOS 系统授权开发
  • Java IO学习笔记一
  • JAVA_NIO系列——Channel和Buffer详解
  • Kibana配置logstash,报表一体化
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Theano - 导数
  • ubuntu 下nginx安装 并支持https协议
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue官网教程学习过程中值得记录的一些事情
  • 彻底搞懂浏览器Event-loop
  • 初识 webpack
  • 对JS继承的一点思考
  • 前端性能优化--懒加载和预加载
  • 使用API自动生成工具优化前端工作流
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 优化 Vue 项目编译文件大小
  • Spring Batch JSON 支持
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​iOS安全加固方法及实现
  • ​插件化DPI在商用WIFI中的价值
  • # 职场生活之道:善于团结
  • #Spring-boot高级
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (2)Java 简介
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (day 12)JavaScript学习笔记(数组3)
  • (Forward) Music Player: From UI Proposal to Code
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (回溯) LeetCode 78. 子集
  • (六) ES6 新特性 —— 迭代器(iterator)