zoukankan      html  css  js  c++  java
  • Hadoop中的RPC应用实例

    RPC概述

      RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数。

      在接触RPC之前,用得最多的莫过于WebService。WebService可以说是在RPC发展的基础之上。RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service等,又比如现在阿里巴巴的Dubbo,Apache下的hadoop项目。该篇楼主主要以hadoop的RPC为例。

      hadoop为何要使用RPC?在HDFS中,我们通过jsp可查看到有DataNode,NameNode,SecondaryNameNode主要进程(楼主只启动了HDFS),我们客户端Client与NameNode通信,NameNode与DataNode的通信,都是在不同进程间,不同系统间的通信。

     

    RPC流程

      通过下图,我们简单分析RPC的执行流程:

      

      首先,要解决通讯的问题,主要是通过在Client和Server之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

      第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。

      第三,当Client上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到Server,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize),通过寻址和传输将序列化的二进制发送给B服务器。

      第四,Server收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。

     

    一、环境准备:

    CentOS 6.9 32位
    Linux和Windows版的Eclipse 32位
    Hadoop 2.4.1版本
    JDK 7+
    

    二、Linux和Windows中的都需要引入Hadoop的Jar包:创建一个 User Libraries,引入

     


    三、Linux中Eclipse作为服务端

    • 1、创建一个接口LoginServiceInterface.java
    package cn.joker.hadoop.rpc;
    
    public interface LoginServiceInterface {
    
        public static final long versionID=1L;
        
        public String login(String username,String password);
        
    }
    • 2、创建一个接口实现类LoginServiceImpl.java
    package cn.joker.hadoop.rpc;
    
    public class LoginServiceImpl implements LoginServiceInterface {
    
        @Override
        public String login(String username, String password) {
            // TODO Auto-generated method stub
            return username + " logged in successfully!";
        }
    
    }
    • 3、创建一个启动类Starter.java
    package cn.joker.hadoop.rpc;
    
    import java.io.IOException;
    
    import org.apache.hadoop.HadoopIllegalArgumentException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    import org.apache.hadoop.ipc.RPC.Builder;
    import org.apache.hadoop.ipc.Server;
    
    public class Starter {
    
        public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
            
        Builder builder = new RPC.Builder(new Configuration());
    
        builder.setBindAddress("weekend110").setPort(10000).setProtocol(LoginServiceInterface.class).setInstance(new LoginServiceImpl());
        
        Server server = builder.build();
        
        server.start();
        
        }
    
    }

    四、Windows中的Eclipse作为客户端:

    • 1、创建一个接口LoginServiceInterface.java
    package cn.joker.hadoop.rpc;
    
    public interface LoginServiceInterface {
        
        public static final long versionID=1L;
        
        public String login(String username,String password);
    
    }
    • 2、创建一个控制类LoginController.java
    package cn.joker.hadoop.rpc;
    
    import java.net.InetSocketAddress;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    public class LoginController {
    
        public static void main(String[] args) throws Exception {
            LoginServiceInterface proxy = RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("weekend110", 10000), new Configuration());
            
            String result = proxy.login("kevintan", "abc1234");
            
            System.out.println(result);
        }
        
        
    }

    五、运行Linux端的服务,再运行Windows端的请求,即可完成一个简单的RPC应用。

  • 相关阅读:
    攻防世界wp--web robots
    kubernetes二: kubernetes 重要组件安装和集群管理
    kibana配置页面跳转
    二进制安装的k8s添加新的node节点
    分布式和微服务的区别
    kubernetes一: 二进制安装k8s集群
    kibana导入导出dashborad
    elk 创建一个只读用户
    x-pack模式下修改es集群密码
    docker基础命令
  • 原文地址:https://www.cnblogs.com/zemul/p/10803074.html
Copyright © 2011-2022 走看看