zoukankan      html  css  js  c++  java
  • 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类的具体实现

     

     

     

     

     

     

     

     

  • 相关阅读:
    教你一招Linux下文本比对方法
    Linux下find与exec的联手干大事
    Linux下Shell日期的格式,你知道几种?
    Linux下Python3.6的安装及避坑指南
    多线程中使用CompletableFuture
    ElasticSearch7.6.2中语法使用(更新中)
    ElasticSearch7.6.2使用_update_by_query语法
    ElasticSearch7.6.2使用_delete_by_query产生版本冲突问题
    filebeat7.6.2进程运行一段时间后自动退出问题解决
    把本地项目提交到gitLab
  • 原文地址:https://www.cnblogs.com/dycg/p/rpc.html
Copyright © 2011-2022 走看看