• 打个 hadoop RPC的栗子


    以豁达和宽容的心态对待学习和生活中遇到的不如意的事。

    需求

    通过RPC远程调用服务端函数来实现加法操作

    maven 依赖

    依赖如下:

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.0</version>
    </dependency>            

    定义RPC通信功能接口

    定义如下:

    package inter;
    
    import org.apache.hadoop.ipc.VersionedProtocol;
    
    import java.io.IOException;
    
    public interface ClientProtocol extends VersionedProtocol {
        public static final long versionID = 1L;
    int add(int v1, int v2) throws IOException;
    }

    接口实现

    实现如下:

    package impl;
    
    import inter.ClientProtocol;
    import org.apache.hadoop.ipc.ProtocolSignature;
    
    import java.io.IOException;
    
    public class ClientProtocolImpl implements ClientProtocol {public int add(int v1, int v2) throws IOException {
            return v1 + v2;
        }
    
        public long getProtocolVersion(String s, long l) throws IOException {
            return ClientProtocol.versionID;
        }
    
        public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {
            return new ProtocolSignature(ClientProtocol.versionID, null);
        }
    }

    服务端代码

    如下:

    package server;
    
    import impl.ClientProtocolImpl;
    import inter.ClientProtocol;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    import java.io.IOException;
    
    public class Server {
        public static void main(String[] args) throws IOException {
            RPC.Server server = new RPC.Builder(new Configuration()).setProtocol(ClientProtocol.class)
                    .setInstance(new ClientProtocolImpl()).setBindAddress("localhost")
                    .setPort(9999)
                    .setNumHandlers(5)
                    .build();
            server.start();
        }
    }

    客户端代码

    如下:

    package client;
    
    import inter.ClientProtocol;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    
    public class Client {
        public static void main(String[] args) throws IOException {
            ClientProtocol proxy = RPC.getProxy(ClientProtocol.class,
                    ClientProtocol.versionID,
                    new InetSocketAddress("localhost", 9999),
                    new Configuration());
            System.out.println("proxy.add(1,2) = " + proxy.add(1, 2));
        }
    }

    总结

    用户只需要实现四部分:RPC行为接口定义,服务端RPC接口行为实现,客户端实现,服务端实现就可以来使用RPC了。

  • 相关阅读:
    python 元组操作
    python安装(python2.7)
    0、
    1、Centos 7 系统的初化始配置
    C# 6.0新特性
    ios学习之路
    Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) ;
    px,em,rem,vw单位在网页和移动端的应用
    html5shiv.js和respond.min.js
    display:inline-block间隙问题
  • 原文地址:https://www.cnblogs.com/johnny666888/p/12613226.html
Copyright © 2020-2023  润新知