文档章节

Hadoop中的RPC

Vegetable
 Vegetable
发布于 2017/08/08 15:29
字数 1261
阅读 19
收藏 0

1. RPC的基础概念

  RPC,即Remote Procdure Call,中文名:远程过程调用;更详细内容可以转到RPC原理及RPC实例分析学习。

  (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

  (2)Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等。

因此,可以说:Hadoop的运行就是建立在RPC基础之上的。Hadoop RPC是Hadoop的一个重要部分,提供分布式环境下的对象调用功能,源码在org.apache.hadoop.ipc中。而HBase也几乎完全copy了这部分的源码,只是在配置项上面有所改动。

2. Hadoop中的RPC机制

  同其他RPC框架一样,Hadoop RPC分为四个部分:

  (1)序列化层:Clent与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型;

  (2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用;

  (3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制;

  (4)服务器端框架层:RPC Server利用java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力;

  Hadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯全靠它了。例如:我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。

3. Hadoop RPC设计技术

(1)动态代理

(2)反射——动态加载类

(3)序列化

(4)非阻塞的异步IO(NIO)

4. Hadoop RPC实例

(1)Protocol

被远程访问的类,也就是Server端,必须实现VersionedProtocol接口,这个接口只有一个方法getProtocolVersion,用来判断Server和Client端调用的是不是一个版本的,一般Server的代码修改一次,版本号就得改一次。

在例子中,我们定义一个接口MyProtocol,继承VersionedProtocol,里面定义Server端需要实现的方法。

这里MyProtocol接口只有一个方法println,输入一个Text,打印出来,并返回一个Text。

MyProtocol.java代码如下:

import org.apache.hadoop.io.Text;
 import org.apache.hadoop.ipc.VersionedProtocol;
 
 public interface MyProtocol extends VersionedProtocol {
     public Text println(Text t);
 }

(2)Server

Server端实现上述的Protocol接口,里面需要启动一个RPC.Server,它是一个Thread。

构造方法是RPC.getServer(Object instance, String bindAddress, int port, Configuration conf)

  • instance:表示提供远程访问的对象,一般Server都会传入this作为参数;
  • bindAddress:Server绑定的ip地址;
  • port:Server绑定的端口;
  • conf:Configuration对象,不用解释了吧。

MyServer实现了MyProtocol接口中定义的println方法,将参数打印到控制台,并返回finish。

MyServer.java代码如下:

 import java.io.IOException;
 import java.net.UnknownHostException;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.ipc.RPC;
 import org.apache.hadoop.ipc.RPC.Server;
 
 public class MyServer implements MyProtocol{
     private Server server;
     
     public MyServer(){
         try {
             server = RPC.getServer(this, "localhost", 8888, new Configuration());
             server.start();
             server.join();
         } catch (UnknownHostException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
     
     @Override
     public Text println(Text t){
         System.out.println(t);
         return new Text("finish");
     }
 
     @Override
     public long getProtocolVersion(String protocol, long clientVersion) throws IOException {
         return 1;
     }
     
     public static void main(String[] args) {
         new MyServer();
     }
 
 }

(3)Client

Client端需要创建一个Server的远程代理,并可以通过操作这个代理,来调用到Server端的方法。

创建代理可以调用RPC.waitForProxy(Class protocol, long clientVersion, InetSocketAddress addr, Configuration conf)

  • protocol:一个Protocol的class,它必须是继承VersionedProtocol的接口;
  • clientVersion:客户端的版本号,如果与服务端不一致,则会抛错;
  • addr:一个InetSocketAddress对象,包含了ip和port;
  • conf:不解释。

这个方法会返回一个VersionedProtocol类型的代理对象,将它强制转型成自己定义的Protocol,接下来就可以操作创建好的代理了。在例子中,我们通过代理来让Server端打印字符串到控制台,并接受返回的消息。

MyClient.java代码如下:

 import java.io.IOException;
 import java.net.InetSocketAddress;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.ipc.RPC;
 
 public class MyClient {
     
     private MyProtocol proxy;
 
     public MyClient(){
         InetSocketAddress addr = new InetSocketAddress("localhost",8888);
         try {
             proxy = (MyProtocol) RPC.waitForProxy(MyProtocol.class, 1, addr , new Configuration());
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
     
     public void println(String s){
         System.out.println(proxy.println(new Text(s)));
     }
 
     public void close(){
         RPC.stopProxy(proxy);
     }
     
     public static void main(String[] args) {
         MyClient c = new MyClient();
         c.println("123");
         c.close();
     }
 }

(4)运行

运行MyServer,控制台显示:

2011-12-30 18:49:56 -[INFO] Initializing RPC Metrics with hostName=MyServer, port=8888
2011-12-30 18:49:56 -[INFO] IPC Server listener on 8888: starting
2011-12-30 18:49:56 -[INFO] IPC Server Responder: starting
2011-12-30 18:49:56 -[INFO] IPC Server handler 0 on 8888: starting

运行MyClient,控制台显示:

finish

MyServer端会追加显示:

123

 

© 著作权归作者所有

共有 人打赏支持
Vegetable
粉丝 18
博文 46
码字总数 46625
作品 0
杭州
私信 提问
Hadoop实战-中高级部分 之 Hadoop RPC

Hadoop RestFul Hadoop HDFS原理1 Hadoop HDFS原理2 Hadoop作业调优参数调整及原理 Hadoop HA Hadoop MapReduce高级编程 Hadoop IO Hadoop MapReduce工作原理 Hadoop 管理 Hadoop 集群安装 ...

2k10
2015/03/23
0
0
Hadoop中RPC机制简介

RPC(Remote Procedure Call)—远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之...

wall--e
2016/04/16
385
0
Hadoop中RPC机制详解之Client端

先看看这个吧, Hadoop 中 RPC 机制简介, Hadoop 中 RPC 机制的实现都在 org.apache.hadoop.ipc 这个包里, 下面都将围绕这个包解读 Hadoop RPC 机制 1. RPC.getServer(Object instance, Stri...

wall--e
2016/05/05
236
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
11/15
0
0
hadoop之HDFS源码分析---HDFS通信协议

一、HDFS中提供两种通信协议 1.Hadoop RPC接口:HDFS中基于Hadoop RPC框架实现的接口 2.流式接口:HDFS中基于TCP或者HTTP实现的接口 二、下面先讲Hadoop RPC接口 Hadoop RPC调用使得HDFS进程...

全部原谅
06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
44分钟前
6
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
8
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部