Hadoop入门教程:RPC框架组成
RPC,远程程序调用,分布式计算中C/S模型的一个应用实例。
Hadoop入门教程:RPC框架组成,同其他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类的具体实现
-
标签错误:<!-- #Label#
labelId=20160707140604
moduleId=1
classId=12231768634
orderby=2
fields=url,title,u_info
attribute=
datatypeId=22192428132
recordCount=3
pageSize=
<htmlTemplate><dt><img src="/images/index_26${index}.jpg" width="100" height="62" /><a href="$url" title="${title}">${title}</a><span>${api.left(u_info,60)}</span></dt></htmlTemplate>
-->
- 我要参加技术沙龙