1.前言

Hadoop的RPC主要是通过Java的动态代理(Dynamic Proxy)与反射(Reflect)实现,源代码在org.apache.hadoop.ipc下,有以下几个主要类:

Client:RPC服务的客户端

RPC:实现了一个简单的RPC模型

Server:服务端的抽象类

RPC.Server:服务端的具体类

VersionedProtocol:所有的使用RPC服务的类都要实现该接口,在创建代理时,用来判断代理对象是否创建正确。

2.Hadoop RPC简单过程

简单来说,Hadoop RPC = 动态代理 + 定制好的二进制流。如果不关注细节,从用户的角度来看,它的结构大致像下图

远程的对象拥有固定的接口,这个接口用户也是可见的,只是真正的实现(Object)只在服务端。用户如果想使用那个实现的话,他的调用过程如此:先根据那个接口动态代理生成一个代理对象,调用这个代理对象的时候,用户的调用请求被RPC捕捉到,然后包装成调用请求,序列化成数据流发送到服务端;服务端从数据流中解析出调用请求,然后根据用户所希望调用的接口,调用接口真正的实现对象,再把调用结果返回给客户端。

3.Hadoop RPC.java里面有什么

RPC提供了一个简单的RPC机制,提供以下几种

静态方法:

1)***Proxy

waitForProxy、getProxy、stopProxy均是与代理有关的方法,其中wait需要保证namenode启动正常且连接正常,主要由SecondayNode、Datanode、JobTracker使用。

Ø 函数原型

1 public static VersionedProtocol getProxy(

2 Class<? extends VersionedProtocol> protocol,

3 long clientVersion,

4 InetSocketAddress addr,

5 UserGroupInformation ticket,

6 Configuration conf,

7 SocketFactory factory) throws IOException;

Ø 参数说明

1) protocol:RPC Server提供RPC服务的接口。

2) clientVersion:客户端的版本号。

3) addr:RPC Server地址。

4) ticket

5) conf:配置项。

6) factory:SOCKET工厂。

stop方法即停止代理。

get则是一般的获取代理的方法, 创建代理实例,获得代理实例的versioncode,再与getProxy方法传入的versioncode做对比,相同返回代理,不同抛出VersionMismatch异常。

2)getServer

创建并返回一个Server实例,由TaskTracker、JobTracker、NameNode、DataNode使用。

Ø 函数原型为:

1 public static Server getServer(

2 final Object instance,

3 final String bindAddress,

4 final int port,

5 final int numHandlers,

6 final boolean verbose,

7 Configuration conf) throws IOException;

Ø 参数说明

1) Instance:RPC Server端对象实例,也就是RPC Client调用的接口实例。

2) bindAddress:RPC Server监听的IP地址。

3) Port:RPC Server监听的端口号。

4) numHandlers:处理Call队列的Handler线程个数。

5) Verbose

6) conf:配置项。

3)call

静态方法,向一系列服务器发送一系列请求,在源码中没见到那个类使用该方法。但注释提到了:Expert,应该是给系统管理员使用的接口。

RPC静态类:

RPC方法仅仅提到了方法的作用,但是具体实现没说,具体实现就涉及到了RPC的静态类了,RPC类中有5个静态内部类,分别为:

RPC.ClientCache用来缓存Client对象;

RPC.Invocation每次RPC调用传的参数实体类,其中Invocation包括了调用方法(Method)和配置文件;

RPC.Invoker具体的调用类,采用Java的动态代理机制,继承自InvocationHandler,有remoteId和client成员,id用以标识异步请求对象,client用以调用实现代码;

RPC.Serverorg.apache.hadoop.ipc.Server的具体类,实现了抽象类的call方法,获得传入参数的call实例,再获取method方法,调用即可。用的是反射机制,反射很绝,再没使用之前,完全不知道该代码会怎么执行;

RPC. VersionMismatch版本不匹配异常。

类图结构

4.协议接口:

Hadoop是master-slave模型,master只会接受请求并相应,slave在发送请求的同时,也有可能会接受其它请求,其它请求来自slave伙伴或者client。

VersionedProtocol说了,所有要使用RPC服务的类都要实现该接口,我们可以来看一下有哪些接口继承了该接口。

1)HDFS相关

ClientDatanodeProtocol:client与datanode交互的接口,操作不多,只有一个block恢复的方法。那么,其它数据请求的方法呢?client与datanode主要交互是通过流式的socket实现,源码在DataXceiver,在这里先不说了;

ClientProtocol:client与Namenode交互的接口,所有控制流的请求均在这里,如:创建文件、删除文件等;

DatanodeProtocol:Datanode与Namenode交互的接口,如心跳、blockreport等;

NamenodeProtocol:SecondaryNode与Namenode交互的接口。

2)Mapreduce相关

InterDatanodeProtocol:Datanode内部交互的接口,用来更新block的元数据;

InnerTrackerProtocol:TaskTracker与JobTracker交互的接口,功能与DatanodeProtocol相似;

JobSubmissionProtocol:JobClient与JobTracker交互的接口,用来提交Job、获得Job等与Job相关的操作;

TaskUmbilicalProtocol:Task中子进程与母进程交互的接口,子进程即map、reduce等操作,母进程即TaskTracker,该接口可以回报子进程的运行状态(词汇扫盲: umbilical 脐带的, 关系亲密的) 。

3)其它

AdminOperationProtocol:不用用户操作的接口,提供一些管理操作,如刷新JobTracker的node列表;

RefreshAuthorizationPolicyProtocol,RefreshUserMappingsProtocol:暂不明白。

参考url

http://www.wikieno.com/2012/02/hadoop-ipc-rpc/

http://langyu.iteye.com/blog/1183337

http://jimmee.iteye.com/blog/1201398

http://jimmee.iteye.com/blog/1201982

http://jimmee.iteye.com/blog/1206201

http://jimmee.iteye.com/blog/1206598

转载于:https://www.cnblogs.com/xuxm2007/archive/2012/06/21/2557726.html

[hadoop源码阅读][6]-org.apache.hadoop.ipc-ipc总体结构和RPC相关推荐

  1. 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境

    本文将介绍如何使用 idea 搭建 Hadoop 源码阅读环境.(默认已安装好 Java.Maven 环境) 一.搭建源码阅读环境 一)idea 导入 hadoop 工程 从 github 上拉取代码 ...

  2. Apache Hadoop 源码阅读(陆续更新)

    不多说,直接上干货! 总之一句话,这些都是hadoop-2.2.0的源代码里有的.也就是不光只是懂理论,编程最重要,还是基本功要扎实啊.... 在hadoop-2.2.0的源码里,按Ctrl + Sh ...

  3. hadoop源码阅读(一)(InputFormat源码)

    InputFormat Inputformat的介绍 1. InputFormat的继承树 1.1 InputFormat源码: 1.2 FileInputFormat源码: 1.3 TextInpu ...

  4. [hadoop源码阅读][9]-mapreduce-概论

    hadoop的mapreduce的运行流程大概就是如下图所示了 如果要是文字描述,估计要大篇幅了,大家可以参考下面的参考文档. 参考文档 1.http://caibinbupt.iteye.com/b ...

  5. Hadoop源码阅读-HDFS-day2

    昨天看到了AbstractFileSystem,也知道应用访问文件是通过FileContext这个类,今天来看这个类的源代码,先看下这个类老长的注释说明 1 /** 2 * The FileConte ...

  6. 如何导入hadoop源码到eclipse

    需要进一步学习hadoop.需要看看内部源码实现,因此需要将hadoop源码导入都eclipse中. 简单总结一下,具体步骤如下: 首先确保已经安装了git.maven3.protobuf2.5.如果 ...

  7. Hadoop源码解读系列目录

    Hadoop源码解读系列 1.hadoop源码|common模块-configuration详解 2.hadoop源码|core模块-序列化与压缩详解 3.hadoop源码|core模块-远程调用与N ...

  8. 编译Hadoop源码

    背景: 在阅读hadoop源代码过程中会发现部分类或者函数无法找到,这是由于Hadoop2.0使用了Protocol Buffers定义了RPC协议, 而这些Protocol Buffers文件在Ma ...

  9. linux eclipse 关联源码,获取Hadoop的源码和通过Eclipse关联Hadoop的源码

    一.获取Hadoop的源码 首先通过官网下载hadoop-2.5.2-src.tar.gz的软件包,下载好之后解压发现出现了一些错误,无法解压缩, 因此有部分源码我们无法解压 ,因此在这里我讲述一下如 ...

最新文章

  1. 利用DHCP,http,tftp,pxe实现批量自动化部署系统
  2. 【C语言】09-字符串
  3. 安装Windows 64 位 mysql 最新版本解压包中没有data目录和my-default.ini及服务无法启动的快速解决办法...
  4. MapReduce基础开发之十二ChainMapper和ChainReducer使用
  5. php 单词替换,如何在PHP中替换字符串中的单词?
  6. MD04读取的一些计算表
  7. OpenCV演示FloodFill()函数的实例(附完整代码)
  8. asp.net 检测访问者是iphone,android,web(摘录)
  9. simulink仿真学习(实现半波整流、方波输出) day1
  10. linux服务chm,linux系统服务 chm
  11. JTable中的MOUSE雙擊事件
  12. 《云计算:概念、技术与架构》一1.5 书写惯例
  13. JAVA并发编程实践 下载
  14. opensuse安装搜狗输入法
  15. 解决pip pandas 安装提示time out
  16. TPScan一键ThinkPHP漏洞检测工具使用
  17. Tom猫游戏代码iOS 素材
  18. 2022 年前面试总结与感悟分享
  19. 计算机毕业论文基于Python实现的学生求职招聘兼职平台
  20. 图片和文字对齐的方法

热门文章

  1. opencv中图像的基本结构 类型的定义
  2. mysql的索引本质是一颗_一文揭开Mysql索引本质
  3. Kaggle-MNIST之路
  4. 2.2.7 局部最优化问题
  5. java怎么快速补缺_Java查漏补缺-小细节
  6. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05...
  7. 完全使用UDP登录Linux
  8. jq点击按钮打开和关闭弹出层,点击除了当前按钮以外的地方关闭弹出层
  9. node读写本地文件
  10. SmartImageView框架的使用