hbase的客户端代码并不想hive一样用java编写,shell调用,而是使用ruby编写。
在admin.rb文件中方法create,其中接受两个参数,其中第二个参数类型为变长参数。
而在create方法的最后,调用了admin.createTable,其中的admin是hbaes.rb初始化时通过调用java代码ConnectionFactory.createConnection创建的connection调用getAdmin而获得的。
 
下面简单分析一下ConnectionFactory.createConnection流程。
默认的hbase.client.connection.impl实现类ConnectionImplementation.class,因此,该方法其实就相当于初始化了ConnectionImplementation。而在ConnectionImplementation中,最主要的构建了类型为NettyRpcClient的rpc客户端。
 
接着,根据源码我们可以发现,然后调用了HBaseAdmin.createTable。在该方法调用的时候,有一些hbase通用的架构,我们接下来一一道来。
 
首先,调用createTableAsync方法,其中构建了一个MasterCallable类型的匿名对象,其复写的rpcCall方法真正的调用了客户端方法。
接下来调用executeCallable方法,然后构建RpcRetryingCaller对象,并调用该对象的callWithRetries方法。在其唯一实现RpcRetryingCallerImpl中我们可以看到
首先调用了传入的callable.prepare方法。由于此时我们分析的callable类型为MasterCallable,因此,我们可以追踪到MasterCallable.prepare方法。在这里,调用了ConnectionImplementation.getMaster方法。接着调用了ConnectionImplementation.getKeepAliveMasterService。接下来,返回rpc调用的本地stub。
然后调用了callable.call方法,而这个call方法最后恰恰调用了匿名对象复写的rpcCall方法。也就是说,他调用了本地stub的createTable方法。
而接下来的调用流程就正如我在上篇博文中所讲的。会调用BlockingRpcChannelImplementation.callBlockingMethod,AbstractRpcClient.callBlockingMethod,AbstractRpcClient.callMethod,NettyRpcConnection.sendRequest,HBaseRpcControllerImpl.notifyOnCancel等一系列方法。
 
在NettyRpcConnection.sendRequest方法中,我们将着重进行分析。以纠正之前所犯的错误。
 
在这里首先执行了connect方法,如下图所示,我们可以发现,这里添加了一个ChannelFutureListener。
通过operationComplete里面的established方法,我们可以看到,通道的pipeline中添加了NettyRpcDuplexHandler。
 
然后执行了write方法,ch.writeAndFlush,学过Netty大家都清楚,下一步就会调用刚刚加入的NettyRpcDuplexHandler.write方法。然后就调用该方法,向服务端发送信息。
 
接着,等待服务端的返回。
服务端接收到客户端后(具体流程可以参考我的上一篇博文[Hbase之rpc调用流程简介]),将响应返回。
并调用下图所示的readResponse方法。
 
 
(而在此之前,在AbstractRpcClient.callBlockingMethod的方法中BlockingRpcCallback.get方法已经开始调用this.wait()。
在BlockingRpcConnection.run方法中,会调用readResponse。(在客户端的实现为BlockingRpcConnection,才会调用。)。
而我们都知道,在调用的实际过程中,hbase的默认客户端实现是NettyRpcConnection。
而在readResponse方法中,类似hadoop中rpc的阻塞一样,调用in.readInt,也就是说等待到服务端的返回后,该方法会继续向下执行。一直到call.setResponse,接着就是call.callComplete,)
 
在readResponse方法的最后,我们可以看到调用了call.setResponse,接着就是callComplete, callback.run,而这里的callback恰恰就是下图中的匿名对象。
 
接着呢,就是调用BlockingRpcCallback.run方法。调用this.notify.。然后将AbstractRpcClient.callBlockingMethod中的阻塞打开,获得server端的返回值。
 
当然,这只是获得了createTable的服务端返回值。接下来会创建CreateTableFuture对象,其中封装了刚刚获得的服务端返回值。
而接下来会继续调用到ProcedureFuture.get(long timeout, TimeUnit unit)方法。在该方法内部,会继续调用waitProcedureResult,getProcedureResult等等一系列方法。其流程与上面所叙述的大体一致,我们就不在这里一一介绍了。所不同的是,这里调用的方法是getProcedureResult。
 
hbase createTable的流程答题时这样,如果感觉对你的理解有帮助,欢迎你的赞赏,如果解答不了你的疑问,可以发送邮件至15935152719@163.com,期待你的来信。
你的赞赏是我前进的动力。

hbase之createTable完整的netty实现执行流程的更多相关文章

  1. Netty学习(二)使用及执行流程

    Netty简单使用 1.本文先介绍一下 server 的 demo 2.(重点是这个)根据代码跟踪一下 Netty 的一些执行流程 和 事件传递的 pipeline. 首先到官网看一下Netty Se ...

  2. Netty 源码 NioEventLoop(三)执行流程

    Netty 源码 NioEventLoop(三)执行流程 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 上文提到在启动 N ...

  3. Netty执行流程分析与重要组件介绍

    一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle  处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...

  4. 一个 Spark 应用程序的完整执行流程

    一个 Spark 应用程序的完整执行流程 1.编写 Spark Application 应用程序 2.打 jar 包,通过 spark-submit 提交执行 3.SparkSubmit 提交执行 4 ...

  5. springMVC的执行流程和完整代码

    一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring ...

  6. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  7. 追源索骥:透过源码看懂Flink核心框架的执行流程

    li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...

  8. 透过源码看懂Flink核心框架的执行流程

    前言 Flink是大数据处理领域最近很火的一个开源的分布式.高性能的流式处理框架,其对数据的处理可以达到毫秒级别.本文以一个来自官网的WordCount例子为引,全面阐述flink的核心架构及执行流程 ...

  9. Netty:数据处理流程

    Netty作为异步的.事件驱动一个网络通信框架,使用它可以帮助我们快速开发高性能高可靠性的网络服务. 为了更好的使用Netty来解决开发中的问题,学习Netty是很有必要的. Netty现在主流有三个 ...

随机推荐

  1. 错误 : 资产文件“项目\obj\project.assets.json”没有“.NETCoreApp,Version=v2.0”的目标。确保已运行还原,且“netcoreapp2.0”已包含在项目的 TargetFrameworks 中。

    升级 vs201715.6.3之后发布出现 错误 : 资产文件“项目\obj\project.assets.json”没有“.NETCoreApp,Version=v2.0”的目标.确保已运行还原,且 ...

  2. php实现下载模板与上传模板解析

    <? //下载模板的请求 if(isset($_GET['action']) && $_GET['action'] =='down_group_excel'){ $code = ...

  3. STS中logback.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false ...

  4. 笔记javascript

    // var demo1=12;// alert('点击确定按钮看结果'+demo1);// for(var i = 0; i<10;i++)// {//     document.write( ...

  5. UE4的委托

    UE中委托的使用很广泛,许多Event的触发都有对应的虚函数和委托,虚函数不用讲,只能在派生类中使用,而委托可以在别的类或者蓝图中使用,就应用范围而言,委托的使用更灵活.以AActor的 /** * ...

  6. 前后台分离开发时遇到循环引用问题"$ref"

    1. 遇到的问题 { "errMsg": "", "data": { "baseinfo": { "freeT ...

  7. Django之发送邮件

    Django的发送邮件是基于django的一个组件进行操作的,EmailMessage 基本使用方法: def send_html_mail(subject, html_content, from_a ...

  8. js怎么把数字转化为字母(A,B.....AA,AB,..)

    function createCellPos( n ){ var ordA = 'A'.charCodeAt(0); var ordZ = 'Z'.charCodeAt(0); var len = o ...

  9. 20155205 郝博雅 Exp6 信息搜集与漏洞扫描

    20155205 郝博雅 Exp6 信息搜集与漏洞扫描 一.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务 ...

  10. python 中爬虫 content和text的区别

    一直在想requests的content和text属性的区别,从print 结果来看是没有任何区别 import requests headers = { "User-Agent" ...