zoukankan      html  css  js  c++  java
  • [hadoop源码阅读][6]org.apache.hadoop.ipcipc总体结构和RPC

    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 = 动态代理 + 定制好的二进制流。如果不关注细节,从用户的角度来看,它的结构大致像下图


    1

          远程的对象拥有固定的接口,这个接口用户也是可见的,只是真正的实现(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版本不匹配异常。

     

    类图结构

    364006e2-f35f-3982-9d89-2763c4eb5cd1

     

    4.协议接口:

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

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

    clip_image002

    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

  • 相关阅读:
    Mac 终端自动补全忽略大小写
    AtCoder ABC 155F Perils in Parallel
    AtCoder ABC 155E Payment
    AtCoder ABC 155D Pairs
    AtCoder ABC 154F Many Many Paths
    牛客 边界都是1的最大正方形大小
    牛客 打印N个数组整体最大的Top K
    牛客 数组中子数组的最大累乘积
    牛客 在数组中找到一个局部最小的位置
    牛客 子矩阵最大累加和问题
  • 原文地址:https://www.cnblogs.com/xuxm2007/p/2557726.html
Copyright © 2011-2022 走看看