当前位置: 首页 > 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本身不会直接解决这些问题,但它提供了有价值的诊断信息,帮助识别和缓解性能瓶颈。

相关文章:

HBase 源码阅读(二)

衔接 在上一篇文章中&#xff0c;HMasterCommandLine类中在startMaster();方法中 // 这里除了启动HMaster之外&#xff0c;还启动一个HRegionServerLocalHBaseCluster cluster new LocalHBaseCluster(conf, mastersCount, regionServersCount,LocalHMaster.class, HRegionSer…...

深度学习每周学习总结N9:transformer复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 多头注意力机制前馈传播位置编码编码层解码层Transformer模型构建使用示例 本文为TR3学习打卡&#xff0c;为了保证记录顺序我这里写…...

数据结构与算法(3)栈和队列

1.前言 哈喽大家好啊&#xff0c;今天博主继续为大家带来数据结构与算法的学习笔记&#xff0c;今天是关于栈和队列&#xff0c;未来博主会将上一章《顺序表与链表》以及本章《栈与队列》做专门的习题应用专题讲解&#xff0c;都会很有内容含量 &#xff0c;欢迎大家多多支持&…...

11、Django Admin启用对计算字段的过滤

重新定义admin.py中的Hero管理模型如下&#xff1a; admin.register(Hero) class HeroAdmin(admin.ModelAdmin):list_display ("name", "is_immortal", "category", "origin", "is_very_benevolent")list_filter ("…...

xxl-job升级到springboot3.0 导致页面打不开报错)问题

原因&#xff1a;springboot3.0 因为移除了jsp 导致xxl-job不能访问&#xff0c;解决方法如下 1、修改PermissionInterceptor拦截器 package com.xxl.job.admin.controller.interceptor;import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.…...

栈和队列.

目录 1. 栈&#xff08;Stack&#xff09; 2. 栈的模拟实现 3. 栈的应用场景 4. 队列&#xff08;Queue&#xff09; 5. 队列的模拟实现 6. 循环队列 7. 双端队列&#xff08;Deque&#xff09; 8. 面试题 1. 栈&#xff08;Stack&#xff09; 栈&#xff1a;一种特殊…...

Parallel.ForEach - 并行处理

Parallel.ForEach 是 C# 中 System.Threading.Tasks.Parallel 类提供的一个方法&#xff0c;用于并行地迭代集合中的每一个元素。Parallel.ForEach 方法允许多个线程同时处理集合中的元素&#xff0c;从而提高程序的执行效率&#xff0c;特别是在处理大量数据或执行耗时任务时。…...

【MySQL】初识MySQL—MySQL是啥,以及如何简单操作???

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL的简单使用和注意事项&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/wwaqe &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目…...

LLM应用实战: 产业治理多标签分类

数据介绍 标签体系 产业治理方面的标签体系共计200个&#xff0c;每个标签共有4个层级&#xff0c;且第3、4层级有标签含义的概括信息。 原始数据 企业官网介绍数据&#xff0c;包括基本介绍、主要产品等 企业专利数据&#xff0c;包括专利名称和专利摘要信息&#xff0c;且专…...

下载Mongodb 4.2.25 版本教程

1、MongoDB 安装包的下载链接 Download MongoDB Community Server | MongoDB 进入如下截图&#xff1a; 2、查找历史版本 往下拉&#xff0c;点击“...”,找到”Archived releases”,点击进入 、 3、下载Mongodb 4.2.25 版本 找到如下图4.2.25版本下载链接&#xff0c;点击就可…...

docker拉取redis5.0.5并建立redis集群

1.配置文件 mkdir -p redis-cluster/7001/ mkdir -p redis-cluster/7002/ mkdir -p redis-cluster/7003/ mkdir -p redis-cluster/7004/ mkdir -p redis-cluster/7005/ mkdir -p redis-cluster/7006/cd redis-clustervim 7001/redis.confbind 0.0.0.0port 7001cluster-enabled…...

React16新手教程记录

文章目录 前言一些前端面试题1. 搭建项目1. 1 cdn1. 2 脚手架 2. 基础用法2.1 表达式和js语句区别&#xff1a;2.2 jsx2.3 循环map2.4 函数式组件2.5 类式组件2.6 类组件点击事件2.6.1 事件回调函数this指向2.6.2 this解决方案2.6.2.1 通过bind2.6.2.2 箭头函数&#xff08;推荐…...

怎么摆脱非自然链接?

什么是非自然链接&#xff1f; 非自然链接是人为创建的链接&#xff0c;用于操纵网站在搜索引擎中的排名。非自然链接违反了Google 的准则&#xff0c;网站可能会因此受到惩罚。 它们不是由网站所有者编辑放置或担保的。示例包括带有过度优化锚文本的链接、通过 PR 的广告、嵌…...

【2024数模国赛赛题思路公开】国赛B题第二套思路丨附可运行代码丨无偿自提

2024年数模国赛B题解题思路 B 题 生产过程中的决策问题 一、问题1解析 问题1的任务是为企业设计一个合理的抽样检测方案&#xff0c;基于少量样本推断整批零配件的次品率&#xff0c;帮助企业决定是否接收供应商提供的这批零配件。具体来说&#xff0c;企业需要依据两个不同…...

P1166 打保龄球

共可以投 1 局 一局10轮 在一局中&#xff0c;一共有十个柱&#xff0c;会出现很多种情况。 第1次把10个 打倒全部 >> 分数10后2次得分 --若是第10轮则还需另加两次滚球&#xff1b; 没全部打倒 >> 第2次把剩下的 打倒 >&g…...

[数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3241 标注数量(xml文件个数)&#xff1a;3241 标注数量(txt文件个数)&#xff1a;3241 标注…...

数仓工具—Hive语法之URL 函数

hive—语法—URL 函数 业务需求中,我们经常需要对用户的访问、用户的来源进行分析,用于支持运营和决策。例如我们经常对用户访问的页面进行统计分析,分析热门受访页面的Top10,观察大部分用户最喜欢的访问最多的页面等: 又或者我们需要分析不同搜索平台的用户来源分析,统…...

c#如何实现触发另外一个文本框的回车事件

一.需求 我需要实现listview中的一行双击后&#xff0c;将其中的一个值传给一个文本框&#xff0c;传完后&#xff0c;给文本框一个回车指令。 我的方法&#xff1a;后面加上 \rthis.txt_ID.Text this.listView1.SelectedItems[0].Text"\r" 结果无效。 二.问通义…...

Vue 中 nextTick 的最主要作用是什么,为什么要有这个 API

在 Vue.js 中&#xff0c;nextTick 是一个用于在 DOM 更新后执行代码的 API。它的主要作用是确保在某个操作完成后&#xff0c;DOM 已经更新且可以被访问或操作。这个 API 在处理需要等待 DOM 更新完成的逻辑时非常有用。 nextTick 的最主要作用 确保 DOM 更新完成: Vue 的响应…...

python科学计算:NumPy 数组的运算

1 数组的数学运算 NumPy 提供了一系列用于数组运算的函数和操作符&#xff0c;这些运算可以作用于数组的每个元素上。常见的数学运算包括加、减、乘、除等。 1.1 元素级运算 NumPy 支持对数组的每个元素进行逐元素运算。这些操作可以通过标准的数学符号或 NumPy 函数来完成。…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...