Hadoop之RPC远程过程调用

目录

一、RPC

1.概念

2.特点

二、Hadoop中RPC机制

1.Hadoop RPC对外提供接口(见类org.apache.hadoop.ipc.RPC)

2.简单应用


一、RPC

1.概念

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易

RPC Client: RPC协议的调用方。

RPC Server:远程方法的提供方。

RPC Proxy/Stub:存在于客户端,因为RPC协议的”透明性”,需要存在一个Stub层封装RPC远程调用的过程实现,让客户端觉得是在本地调用方法一样。

RPC Processor/Selector:存在于服务端,由于服务器端某一个RPC接口的实现的特性(它并不知道自己是一个将要被RPC提供给第三方系统调用的服务),所以在RPC框架中应该有一种“负责执行RPC接口实现”的角色。它负责了包括:管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在内的各种工作。

MessageProtocol:由于一次交互都有服务端和客户端两端都能识别的,共同约定的格式。消息管理层负责对消息的编码和解码。同时要保证消息序列化的高效性。

Transfer/Network:负责管理RPC框架所使用的网络协议、网络IO模型。

IDL:接口定义语言,为跨语言的特性设计的通用的消息格式。

2.特点

(1)透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样;

(2)高性能:RPC Server能够并发处理多个来自Client的请求;

(3)可控性:jdk中已经提供了一个RPC框架—RMI,但是该PRC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的PRC框架。

Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等

二、Hadoop中RPC机制

Hadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯全靠它了。例如:我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。

1.Hadoop RPC对外提供接口(见类org.apache.hadoop.ipc.RPC

(1)public static <T> ProtocolProxy <T> getProxy/waitForProxy(…)

构造一个客户端代理对象(该对象实现了某个协议),用于向服务器发送RPC请求

(2)public static Server RPC.Builder (Configuration).build()

为某个协议(实际上是Java接口)实例构造一个服务器对象,用于处理客户端发送的请求

2.简单应用

(1)定义接口SomeServiceI

public interface SomeServiceI {
     public static final long versionID = 1234L;//该字段必须要有,不然会报java.lang.NoSuchFieldException: versionID异常
     public String doSomething(String str);
    }

(2)定义接口实现类SomeServiceImpl

public class SomeServiceImpl implements SomeServiceI{
     @Override
    public String doSomething(String str) {
        return str;
    }
} 

(3)服务器端RPCServer

绑定被调用的对象,实例,地址,端口

public class RPCServer  {
    public static void main(String[] args) throws  Exception {
        Server server = new RPC.Builder(new Configuration())        
        .setProtocol(SomeServiceI.class)
        .setInstance(new SomeServiceImpl())
        .setBindAddress("192.168.2.100")
        .setPort(10000)
        .build();
        server.start();
    }
}

(4)客户端RPCClient

public class RPCClient {
    public static void main(String[] args) throws Exception {
        MyBizable proxy = RPC.getProxy(SomeServiceI.class, 1234L,new InetSocketAddress("192.168.2.100", 10000) , new Configuration());
        String result = proxy.doSomething("服务端");
        System.out.println(result);
        RPC.stopProxy(proxy);
    }

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值