第二篇 hbase2.4.2 源码分析 RegionServer启动流程

2024-01-25 09:58

本文主要是介绍第二篇 hbase2.4.2 源码分析 RegionServer启动流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第二篇 hbase2.4.2 源码分析 RegionServer启动流程

  • 前言
  • 一、HRegionServer类继承关系
  • 二、HRegionServer.main入口分析
    • 1.main入口
    • 2.HRegionServer.run()分析 核心服务都在这启动
  • 三、 HRegionServer和master的rpc如何调用?
  • 总结


前言

1.看什么? 看HRegionServer类说明 看main()入口 看初始化了哪些重要组件 如何进行远程调用 如何看:看过程中画图,或者把方法的调用关系,对象的调用按照调用关系记录下来,本文按照第二种方式进行编写

一、HRegionServer类继承关系

看什么?
看类说明,看继承关系
从哲学角度看:这是性质问题
HRegionServer 是个线程,实现 RegionServerServices, LastSequenceId, ConfigurationObserver 几个接口,既然是线程,肯定有run方法

/*** HRegionServer makes a set of HRegions available to clients. It checks in with* the HMaster. There are many HRegionServers in a single HBase deployment.*/
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)
@SuppressWarnings({ "deprecation"})
public class HRegionServer extends Thread implementsRegionServerServices, LastSequenceId, ConfigurationObserver {

二、HRegionServer.main入口分析

1.main入口

  /*** @see org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine*/public static void main(String[] args) {LOG.info("STARTING executorService " + HRegionServer.class.getSimpleName());VersionInfo.logVersion();Configuration conf = HBaseConfiguration.create();@SuppressWarnings("unchecked")Class<? extends HRegionServer> regionServerClass = (Class<? extends HRegionServer>) conf.getClass(HConstants.REGION_SERVER_IMPL, HRegionServer.class);new HRegionServerCommandLine(regionServerClass).doMain(args);}
HRegionServerCommandLine.doMain()如下/*** Parse and run the given command line. This may exit the JVM if* a nonzero exit code is returned from <code>run()</code>.*/public void doMain(String args[]) {try {//核心代码,为什么是核心代码?除了它,还有其他值得看的吗?int ret = ToolRunner.run(HBaseConfiguration.create(), this, args);if (ret != 0) {System.exit(ret);}} catch (Exception e) {LOG.error("Failed to run", e);System.exit(-1);}}public static int run(Configuration conf, Tool tool, String[] args) throws Exception {if (CallerContext.getCurrent() == null) {CallerContext ctx = (new Builder("CLI")).build();CallerContext.setCurrent(ctx);}if (conf == null) {conf = new Configuration();}GenericOptionsParser parser = new GenericOptionsParser(conf, args);tool.setConf(conf);String[] toolArgs = parser.getRemainingArgs();//在这里真正调用,org.apache.hadoop.util.Tool竟然是Hadoop包的,我在想,为什么,不直接在hbase包下启动就好了,吐槽。。。return tool.run(toolArgs);}tool就是:  HRegionServerCommandLine, 找HRegionServerCommandLine.run()@Overridepublic int run(String args[]) throws Exception {if (args.length != 1) {usage(null);return 1;}String cmd = args[0];if ("start".equals(cmd)) {//启动代码,追进去看看return start();} else if ("stop".equals(cmd)) {System.err.println("To shutdown the regionserver run " +"hbase-daemon.sh stop regionserver or send a kill signal to " +"the regionserver pid");return 1;} else {usage("Unknown command: " + args[0]);return 1;}}//到达启动流程
private int start() throws Exception {Configuration conf = getConf();TraceUtil.initTracer(conf);try {// If 'local', don't start a region server here. Defer to// LocalHBaseCluster. It manages 'local' clusters.//local模式if (LocalHBaseCluster.isLocal(conf)) {LOG.warn("Not starting a distinct region server because "+ HConstants.CLUSTER_DISTRIBUTED + " is false");} else {//集群模式logProcessInfo(getConf());HRegionServer hrs = HRegionServer.constructRegionServer(regionServerClass, conf);hrs.start(); //启动,触发HRegionServer的run方法hrs.join();  //等待线程结束if (hrs.isAborted()) {throw new RuntimeException("HRegionServer Aborted");}}} catch (Throwable t) {LOG.error("Region server exiting", t);return 1;}return 0;}

2.HRegionServer.run()分析 核心服务都在这启动

代码如下(示例):

run()preRegistrationInitializationsetupClusterConnection()初始化clusterConnection和MetaTableLocatorinitializeZooKeeper()initializeThreads()跟master进行注册RegionServerStartupResponse w = reportForDuty();handleReportForDutyResponse()处理master返回的响应createMyEphemeralNode() 在zk的/rs目录进行注册(创建临时节点)initializeFileSystem();setupWALAndReplication();startReplicationService()JvmPauseMonitor() jvm fullGC停顿检测线程startServices() --启动很多服务和线程HeapMemoryManager管理器启动

三、 HRegionServer和master的rpc如何调用?

RegionServerStartupResponse w = reportForDuty();RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder();if (!StringUtils.isBlank(useThisHostnameInstead)) {request.setUseThisHostnameInstead(useThisHostnameInstead);}request.setPort(port);request.setServerStartCode(this.startcode);request.setServerCurrentTime(now);这里的rss就是跟master交互的接口result = rss.regionServerStartup(null, request.build());
这种request.newBuilder().build() builder模式生成请求,然后进行rpc交互,采用google,gRpc协议通信
那怎么知道,哪个类接收到regionserver发起的rpc请求?     直接搜索regionServerStartup方法,看看有哪个类实现了该方法

发现是MasterRpcServices实现了,查看方法实现,只是把regionserver的信息放到一个map里面保存

调用栈:regionServerStartup checkAndRecordNewServerrecordNewServerWithLock/*** Adds the onlineServers list. onlineServers should be locked.* @param serverName The remote servers name.*/void recordNewServerWithLock(final ServerName serverName, final ServerMetrics sl) {LOG.info("Registering regionserver=" + serverName);this.onlineServers.put(serverName, sl);this.rsAdmins.remove(serverName);}

在这里插入图片描述

总结

regionserver启动 : 构造器初始化,线程启动,run()方法调用,启动一堆看不懂服务。。。 rpc调用: 使用 gRpc框架

这篇关于第二篇 hbase2.4.2 源码分析 RegionServer启动流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642919

相关文章

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx