Hadoop RPC机制

转自:http://blog.sina.com.cn/s/blog_4438ac090101q8iy.html

一、什么是RPC?
(1)Remote Procdure call ,远程方法调用,它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。经常用于分布式网络通信中。
(2)Hadoop的进程间交互都死通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等。

流程:
(1)RPC采用了C/S的模式;
(2)Client端发送一个带有参数的请求信息到Server;
(3)Server接收到这个请求以后,根据发送过来的参数调用相应的程序,然后把自己计算好的结果发送给Client端;

(4)Client端接收到结果后继续运行;

RPC特点
(1)透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样;
(2)高性能:RPC server能够并发处理多个来自Client的请求;

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

二、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 <wbr>RPC机制

Hadoop RPC设计技术
(1)动态代理
(2)反射——动态加载类
(3)序列化
(4)非阻塞的异步IO(NIO)


java动态代理
相关类与接口:
1.java.lang.reflect.Proxy
2.java.lang.reflect.InvocationHandler
动态代理创建对象过程:
1.InvocationHandler handler = new InvocationHandlerImpl();
2.Proxy.newProxyInstance();

(1)动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象。
(2)动态代理可以对请求进行其他的一些出来,在不允许直接访问某些类,或需要对访问做一些特殊处理等,这时候可以考虑使用代理。

(3)目前Java开发包中提供了对动态代理的支持,但现在只支持对接口的实现。


三、动态代理实例
创建包DynamicProxy,
CalculationProtocol.java:
package DynamicProxy;

public interface CalculationProtocol {
public int add(int a,int b);
public int sub(int a,int b);

}

A.java:
package DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;



public class A implements CalculationProtocol{

@Override
public int add(int a, int b) {
// TODO Auto-generated method stub
return a+b;
}

@Override
public int sub(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
public static void main(String[] args){
A a = new A();
InvocationHandler handler = new CalculationHandler(a);
CalculationProtocol a_proxy = (CalculationProtocol)Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), handler);
System.out.println(a_proxy.add(3, 4));
// System.out.println(a.add(3, 4));

}

}
class CalculationHandler implements InvocationHandler{

private Object originalObj;
public CalculationHandler(Object obj){
this.originalObj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("before call invoke");
Object res = method.invoke(originalObj, args);
System.out.println("after call invoke");
return res;
}
}


四、RPC实例
源码参考位于org.apache.hadoop.ips包
创建包MyRPC,
MyRPCProtocol.java:
package MyRPC;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.ipc.VersionedProtocol;

public interface MyRPCProtocol extends VersionedProtocol {
public Text test(Text t);
}

RPCClient.java:
package MyRPC;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.ipc.RPC;

public class RPCClient {
private MyRPCProtocol proto;
public RPCClient() throws IOException {
InetSocketAddress addr = new InetSocketAddress("localhost",8888);
proto = (MyRPCProtocol)RPC.waitForProxy(MyRPCProtocol.class, 1, addr, new Configuration());
}
public void call(String s){
System.out.println(proto.test(new Text(s)));
}
public static void main(String[] args) throws IOException{
RPCClient client = new RPCClient();
client.call("RPC");
}
}

RPCServer.java:
package MyRPC;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;

public class RPCServer implements MyRPCProtocol {
Server server = null;

public RPCServer() throws IOException, InterruptedException {
server = RPC.getServer(this, "localhost", 8888, new Configuration());
server.start();
server.join();
}

public static void main(String[] args) throws IOException,InterruptedException{
new RPCServer();
}

@Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
// TODO Auto-generated method stub
return 1;
}

@Override
public Text test(Text t) {
// TODO Auto-generated method stub
if(t.toString().equals("RPC"))
return new Text("1");
return new Text("0");
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值