Hadoop基础教程:RPC框架基础
最新学讯:近期OCP认证正在报名中,因考试人员较多请尽快报名获取最近考试时间,报名费用请联系在线老师,甲骨文官方认证,报名从速!
我要咨询RPC,远程程序调用,分布式计算中C/S模型的一个应用实例。
同其他RPC框架一样,Hadoop分为四个部分:序列化层:支持多种框架实现序列化与反序列化;函数调用层:利用Java反射与动态代理实现;网络传输层:基于TCP/IP的Socket机制;服务的处理框架:基于Reactor模式的事件驱动IO模型
Hadoop RPC主要对外提供2种接口
public static ProtocolProxy getProxy/waitForProxy:
构造一个客户端代理对象,向服务器发送RPC请求
public static Server RPC.Builder(Configuration).build(…):
为某个协议实例构造一个服务器对象,用于处理客户端发送请求。
如何使用Hadoop RPC?
其实很简单,按照下面四步即可完成高性能CS网络模型
1.定义RPC协议
2.实现RPC协议
3.构造和启动RPC SERVER
4.构造RPC Client并发送请求
下面是代码实例, 依赖Hadoop-common-版本.jar
1.定义RPC协议
Hadoop中所有自定义RPC接口都必须继承VersionedProtocol接口
package myrpc;
import org.apache.Hadoop.ipc.VersionedProtocol;
/**
* Created by ywszjut on 14-8-22.
*/
public interface ClientProtocol extends VersionedProtocol {
public static final long versionID=1L;
String echo(String value);
}
2.实现协议
package myrpc;
import org.apache.Hadoop.ipc.ProtocolSignature;
import Java.io.IOException;
/**
* Created by ywszjut on 14-8-22.
*/
public class ClientProtocolImpl implements ClientProtocol {
@Override
public String echo(String value) {
return "hello "+value;
}
@Override
public long getProtocolVersion(String s, long l) throws IOException {
return ClientProtocol.versionID;
}
@Override
public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {
return new ProtocolSignature(ClientProtocol.versionID,null);
}
}
3.构造和启动RPC SERVER
package myrpc;
import org.apache.Hadoop.conf.Configuration;
import org.apache.Hadoop.ipc.RPC;
import org.apache.Hadoop.ipc.RPC.Server;
import Java.io.IOException;
/**
* Created by ywszjut on 14-8-22.
*/
public class MyRpcServer {
public static void main(String[] args) throws IOException {
Server server = new RPC.Builder(new Configuration()).setProtocol(ClientProtocol.class)
.setInstance(new ClientProtocolImpl()).setBindAddress("127.0.0.1").setPort(8787)
.setNumHandlers(5).build();
server.start();
}
}
4.构造客户端并发送请求
package myrpc;
import org.apache.Hadoop.conf.Configuration;
import org.apache.Hadoop.ipc.RPC;
import Java.io.IOException;
import Java.net.InetSocketAddress;
/**
* Hello world!
*/
public class Client {
public static void main(String[] args) throws IOException {
ClientProtocol proxy = (ClientProtocol) RPC.getProxy(ClientProtocol.class,ClientProtocol.versionID,new InetSocketAddress("127.0.0.1",8787),new Configuration());
String result = proxy.echo("123");
System.out.println(result);
}
}
测试的时候,先启动3,再启动4,你会发现控制台打出了hello 123
好,既然hello world 搞完, 开始学习RPC类的具体实现