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应用。

猜你喜欢

转载自www.cnblogs.com/zemul/p/10803074.html
今日推荐