您的位置:首页 > 运维架构

hadoop rpc基础

2015-11-24 22:27 288 查看
第一部分: hadoop rpc基础

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类的具体实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: