HADOOP-RPC机制


转载自

一、RPC基本概念:

1、RPC,即Remote Procdure Call,中文名:远程过程调用;
  (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。
   (2)Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等。
因此,可以说:Hadoop的运行就是建立在RPC基础之上的。
补充:RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
2、RPC的显著特点
  (1)透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样;
  (2)高性能:RPC Server能够并发处理多个来自Client的请求;
  (3)可控性:jdk中已经提供了一个RPC框架—RMI,但是该PRC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的PRC框架。
3、RPC的基本流程
   (1)RPC采用了C/S的模式;
  (2)Client端发送一个带有参数的请求信息到Server;
  (3)Server接收到这个请求以后,根据发送过来的参数调用相应的程序,然后把自己计算好的结果发送给Client端;
  (4)Client端接收到结果后继续运行;
4、 Hadoop中的RPC机制
  同其他RPC框架一样,Hadoop RPC分为四个部分:
  (1)序列化层:Clent与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型;
  (2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用;
  (3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制;
  (4)服务器端框架层:RPC Server利用java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力;
  Hadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯全靠它了。例如:我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。

二、RPC使用:

1、创建接口,该接口类在服务端和客户端都必须有。接口必须继承VersionedProtocol

public interface Serverif extends VersionedProtocol

2、在服务端实现接口类

public class ServerImpl implements Serverif

3、服务端,使用实现的类启动服务,需要定义监听的IP地址和端口

Server server = RPC.getServer(si, SERVERADDRESS, SERVERPORT, 10, true, conf);

server.start();

4、客户端定义远程连接

InetSocketAddress sa = new InetSocketAddress(SERVERADDRESS, SERVERPORT);

5、客户端使用远程连接,通过接口定义,调用服务端具体实现

Serverif si = (Serverif) RPC.getProxy(Serverif.class, versionID, sa, conf);

return si.method(args);

三、实例:

1、接口

package rpc;  
import org.apache.hadoop.ipc.VersionedProtocol;  
public interface IMyBiz extends VersionedProtocol{  
    public Long VERSION = 123L;  
    public String sayHello(String str);  
}  
}2、实现:

package rpc;  
import java.io.IOException;  
public class MyBiz implements IMyBiz {  
    public String sayHello(String str) {  
        return "hello"+str;  
    }  
    @Override  
    public long getProtocolVersion(String s, long l) throws IOException {  
        // TODO Auto-generated method stub  
        return VERSION;  
    }  
}  
3、服务:

package rpc;  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.ipc.RPC;  
import org.apache.hadoop.ipc.RPC.Server;  
public class MyServer {  
    public static final String HOSTNAME = "localhost";  
    public static final int PORT = 12345;  
    /** 
     * @param args 
     * @throws Exception  
     */  
    public static void main(String[] args) throws Exception {  
        Configuration con = new Configuration();  
        Server server = RPC.getServer(new MyBiz(), HOSTNAME, PORT, con);  
        server.start();  
    }  
}  
4、客户端:

package rpc;  
import java.net.InetSocketAddress;  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.ipc.RPC;  
public class MyClient {  
    /** 
     * @param args 
     * @throws Exception  
     */  
    public static void main(String[] args) throws Exception {  
        InetSocketAddress addr = new InetSocketAddress("localhost",12345);  
        IMyBiz proxy = (IMyBiz)RPC.waitForProxy(IMyBiz.class, IMyBiz.VERSION, addr, new Configuration());  
        String str = proxy.sayHello("word");  
        System.out.println("客户端输出:"+str);  
        RPC.stopProxy(proxy);  
    }  
}  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值