第二篇 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

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M