Hadoop之RPC机制

什么是RPC机制

Remote Procedure Call(简称:RPC):远程过程调用协议。

RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易

RPC的运行模式

RPC采用客户机/服务器模式。

请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC的简单实现

客户端和服务端通信必须要按照某种协议来执行,要不就乱套了。那么我们来定一个RPC协议的接口,里面包含协议的版本号,及RPC方法名。

package com.itunic.rpc;

/**
 * RPC协议定义接口
 * @author itunic
 *
 */
public interface RPCProtocal {
 /**
     * 定义RPC协议版本号
     */
 public static final long versionID = 1111;

 /**
     * 根据id获取名字
     * @param id
     * @return
     */
 public String getName(String id);

}

定义完成后,实现RPC服务端,服务端必须实现上面RPC接口。然后在启动服务时将服务绑定到某个ip下的某个端口。这样才能正常的进行服务。

package com.itunic.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.Server;

/**
 * RPC服务端的简单实现
 * @author itunic
 *
 */
public class RPCService implements RPCProtocal {

 @Override
 public String getName(String id) {
        System.out.println("查找");
 return id + "的Name";
    }

 /**
     * 设置RPC协议接口,将服务绑定到192.168.31.104:9999
     * @param args
     * @throws HadoopIllegalArgumentException
     * @throws IOException
     */
 public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
        Server server = new RPC.Builder(new Configuration()).setInstance(new RPCService())
                .setProtocol(RPCProtocal.class).setBindAddress("192.168.31.104").setPort(9999).build();
        server.start();
    }

}

这样的话服务端就实现完毕了。我们运行一下,看看结果

可以看到服务端已经正常运行了。接下来我们实现RPC客户端的代码。

package com.itunic.rpc;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

/**
 * RPC客户端简单实现
 * @author itunic
 *
 */
public class RPCClient {
 public static void main(String[] args) throws IOException {
 /**
         * 绑定RPC协议接口,输入RPC协议版本号,绑定服务端地址和端口
         * 绑定完成后,调用接口的getName方法。
         */
        RPCProtocal proxy = RPC.getProxy(RPCProtocal.class, 1111, new InetSocketAddress("192.168.31.104", 9999),
 new Configuration());
        String name= proxy.getName("itunic");
        System.out.println(name);
        RPC.stopProxy(proxy);
    }

}

接下来我们看一下运行效果:

首先是服务端已经出发了getName方法,并已经输出到控制台。

其次是客户端已经输出。

结语

讲到这里RPC基本上介绍完毕,在了解完RPC后,就能基本理解Hadoop具体是怎么运行的了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人分享

Hadoop源码学习之HDFS(一)

  Hadoop的HDFS可以分为NameNode与DataNode,NameNode存储所有DataNode中数据的元数据信息。而DataNode负责存储真正...

621
来自专栏伦少的博客

Spark架构原理

2075
来自专栏钟绍威的专栏

内存屏障保证缓存一致性优化

 在前面内存系统重排序提到,“写缓存没有及时刷新到内存,导致不同处理器缓存的值不一样”,出现这种情况是糟糕的,所幸处理器遵循缓存一致性协议能够保证足够的可见性又...

2279
来自专栏Java大联盟

Java面试手册:线程专题 ①

632
来自专栏coder修行路

python爬虫番外篇(一)进程,线程的初步了解

整理这番外篇的原因是希望能够让爬虫的朋友更加理解这块内容,因为爬虫爬取数据可能很简单,但是如何高效持久的爬,利用进程,线程,以及异步IO,其实很多人和我一样,故...

1916
来自专栏JMCui

多线程编程学习一(Java多线程的基础).

一、进程和线程的概念 进程:一次程序的执行称为一个进程,每个 进程有独立的代码和数据空间,进程间切换的开销比较大,一个进程包含1—n个线程。进程是资源分享的最小...

3227
来自专栏Ryan Miao

java线程(1)--概念基础

参考:http://lavasoft.blog.51cto.com/62575/99150 http://blog.csdn.net/baby_newstar/...

3148
来自专栏王小雷

MapReduce的编程思想(1)

MapReduce的编程思想(1) MapReduce的过程(2) 1. MapReduce采用分而治之的思想,将数据处理拆分为主要的Map(映射)与Reduc...

1716
来自专栏CDA数据分析师

读书 | Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =。这三章主要讲Spark的运行过程...

1916
来自专栏强仔仔

MySQL数据库系列之数据库设计原则

MySQL中数据库设计原则: 1.一般情况下,应该尽量使用可以正确存储数据的最小数据类型。数据类型不一样,存储的执行效率也不一样。最好使用适度的整型数据类型,...

22210

扫码关注云+社区