首先,让我们来到HMaster的main方法。我们今天的流程就从这里开始。






















接下来,让我们来到RSG2的,这是HMaster或HRegionServer在构造的重量级方法。由于我们这里只介绍HMaster,因此来到HMaster覆写的createRpcServices中,显然,在这里构建了MasterRpcServices。
我们可以看到,HMaster在构造时调用了其父类的构造方法RSRpcServices。









在NettyRpcServer的构造方法中,首先调用了其父类的构造方法,其中值得留意的是将传入的scheduler保存到了成员变量中,其它初始化的内容我们这里就不赘述了。然后来到第二个框中的内容,这里的getEventLoopGroupConfig获得的对象正是HRegionServer在构造一开始调用setupNetty获得的。忘记的同学可以看看往上面翻翻。
接下来,在第三个框中,熟悉netty的同学可能就很清楚了,在这里构造了netty的服务端对象,最后,绑定了服务端端口并开始监听。
在这里需要关注下面的一个方法createNettyRpcServerPreambleHandler。在这个方法中创建了NettyRpcServerPreambleHandler,而这个handler也就是我将要在下一节介绍的完整rpc流程中服务端处理的第一个Handler。这里只是简单提一下,希望各位同学有一点印象。


上面已经为各位同学介绍了RSG2中的createRpcServices,下面简单介绍一下RSG2中的initializeFileSystem方法。在这里初始化了两个HFileSystem。




来到RSRpcServices.start方法,由于我并没有配置Authorization的有关信息,因此,在这里,主要调用了rpcServer.start。还记得在上面创建的rpcServer的类型吗。没错,就是在上面通过反射方式创建的NettyRpcServer。






因而,来到FastPathBalancedQueueRpcExecutor,可以看到,返回的对象类型为FastPathHandler。在构造好FastPathHandler对象之后,调用了start方法。FastPathHandler继承自Handler。再往下看。
来到Handler类,看到其继承自Thread,并且覆写了Thread的run方法。也就是说,在上面调用start方法的时候,这里的run方法开始运行。由于Handler的实际类型为FastPathHandler,因此,在真正运行时,下图调用的getCallRunner为FastPathHandler.getCallRunner。比较关心的同学可以自己看一下。在这一节重点并不是这里,就点到为止了。
到现在为止,rpcServices的启动完成了,并且HMaster就可以处理HRegionServer或客户端发送来的请求了。各位同学可能还不清楚为什么。我在这里通过下面的图来简单介绍一下。客户端请求到服务端后,来到这里,将通过调用scheduler.dispatch,这里的sceduler也就是我在前面提到的SimpleRpcScheduler。由于刚刚handler已经启动完成,所有dispath后的所有请求,都可以由handler处理,而在上面,handler还没有启动,所以还没有办法处理。我在上面抛出的疑问也就解决了。至于以后的流程,我将在下一节详细介绍,欢迎大家关注。




在RSG3中,然后创建了ChoreService。很多同学可能会对ChoreService不太清楚。其实ChoreService就是对很多继承自ScheduledChore的周期性调用。在ChoreService内部有一个周期性调度线程池ScheduledThreadPoolExecutor。在实例化时其真正类型一般是JitterScheduledThreadPoolExecutorImpl。而ScheduledChore是通过ChoreService调度激活的任务。ScheduledChore在ChoreService中调度运行时会与ChoreService中其他ScheduledChores竞争访问ChoreService线程池中的线程。
接着创建了ExecutorService,注意这里的并非java中的ExecutorService,而是org.apache.hadoop.hbase.executor.ExecutorService。后面在HMaster调用startServiceThreads时会用到。
到此,HMaster的构建完成了。