hadoop rpc基础

第一部分: 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类的具体实现

 

 

 

 

 

 

 

 

posted @ 2014-08-23 00:52  东苑草根  阅读(2558)  评论(0编辑  收藏  举报
手牵手 一步两步三步 往上爬