RPC--HDFS节点间的沟通桥梁
RPC(Remote Procedure Call, 远程过程调用)是一种通过网络从远程计算机上请求服务来得到计算服务或者数据服务,且不需要了解底层网络技术的协议和框架。
RPC远程调用是构建在语言级别的,必须使用Socket通信完成,将现有的本地方法调用和Socket网络通信技术结合起来实现透明的远程调用过程。实现透明的远程调用重点是创建客户存根(client stub),存根(stub)就像代理(agent)模式里的代理(agent),在生成代理代码后,代理代码与远程服务端通信,通信过程由RPC框架实现,调用者像调用本地代码一样方便。在客户端看来,存根函数像普通本地函数一样,实际包含了网络发送和接收消息的代码。具体过程如下图所示。

客户端调用本地客户端的存根方法(client stub),将参数打包并封装成一个或多个网络消息体,这个过程被称为编码(encode),它会将所有数据序列化成字节数组格式;
client stub通过系统调用,使用操作系统内核提供的Socket套接字接口来向远程服务发送编码的网络消息;
网络消息由内核通过网络协议(无连接协议:UDP, 或面向连接的协议:TCP)传输到远程服务端;
服务端存根(server stub)接收客户端发送的消息,并对参数消息进行解码(decode),通常它会将参数从标准的网络格式转换成特定的语言格式;
server stub调用服务端方法,并将从客户端接收的参数传递给该方法;
服务端方法执行具体的功能并返回,此部分代码的执行对客户端而言就是远程过程调用;
服务端在方法执行完后,讲结果返回到服务端存根代码中;
服务端存根在降该返回值进行编码并序列化后,通过一个或多个网络消息发送给客户端;
消息通过网络发送到客户端存根;
客户端存根从本地Socket接口中读取结果消息;
客户端存根将结果返回给客户端函数,并将消息从网络二进制形式转换为本地语言格式,这样就完成了远程服务调用,客户端代码继续执行后续操作。
Socket套接字:网络上两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端被称为Socket。Socket用于描述IP地址和端口,是一个通信连接的句柄,可以用来实现不同计算机之间的通信,是网络编程接口的具体实现。
Socket是客户端/服务端网络结构程序的基本组成部门,为程序提供了一种相对简单的机制与远程机器上的程序建立连接,并来回发送消息。基于这些收发功能,将RPC的调用包装成透明的远程服务调用。
HDFS的底层通信是通过RPC和动态代理对象Proxy实现的。Hadoop RPC的使用方法分为以下几步:
定义RPC协议。RPC协议是客户端和服务器之间的通信接口,它定义了服务器对外提供的服务接口;
实现RPC协议。Hadoop RPC是一个Java接口,需要用户实现。
构造并启动RPC Server。直接使用静态方法getServer()构造一个RPC Server,并调用start()方法启动该Server。
构造RPC Client,并发送RPC请求。使用静态方法getProxy()构造客户端代理对象,直接通过代理对象调用远程端的方法。
HDFS RPC代码示例:
服务端代码
package beichen.rpc.server;import org.apache.hadoop.ipc.VersionedProtocol;public interface MyInterface extends VersionedProtocol{
//定义一个版本号,使用版本号来进行签名
public static long versionID = 1;
//定义业务方法
public String sayHello(String name);}package beichen.rpc.server;import java.io.IOException;import org.apache.hadoop.ipc.ProtocolSignature;public class MyInterfaceImpl implements MyInterface {@Override
public String sayHello(String name) {
System.out.println("*********调用到了Server 端**********");
return "Hello "+name;
}@Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException {
//通过版本号定义签名信息
return new ProtocolSignature(MyInterface.versionID, null);
}@Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
//返回版本号
return MyInterface.versionID;
}}package beichen.rpc.server;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.Server;public class MyRPCServer {public static void main(String[] args) throws Exception
{
//利用Hadoop RPC的框架实现RPC Server,使用RPC Builder来构建
RPC.Builder builder = new RPC.Builder(new Configuration());
//定义Server的参数
builder.setBindAddress("localhost");
builder.setPort(7788);
//部署程序
builder.setProtocol(MyInterface.class);
//部署的接口
builder.setInstance(new MyInterfaceImpl());
//指定接口的实现类
// 创建RPC Server
Server server = builder.build();
//启动Server
server.start();
}}
客户端代码
package beichen.rpc.client;import java.io.IOException;import java.net.InetSocketAddress;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import beichen.rpc.server.MyInterface;public class MyRPCClient {
// 使用Hadoop RPC的框架调用Server 端的程序
public static void main(String[] args) throws Exception {
//得到的是Server端部署对象的代理对象
MyInterface proxy = RPC.getProxy(MyInterface.class,
MyInterface.versionID,new InetSocketAddress("localhost", 7788),
new Configuration());//使用这个代理对象调用Server的程序
String result = proxy.sayHello("Tom");
System.out.println(result);
}}
RPC--HDFS节点间的沟通桥梁的更多相关文章
- React数据流和组件间的沟通总结
今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...
- React的单向数据流与组件间的沟通
今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...
- 集群节点间网络通信TIPC
1. TIPC背景介绍 TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括: 协议发送的大部分message都是直接到达目的地(无路由): message的传输时间都很短; messag ...
- galera cluster DDL节点间状态不一致的问题
近期某个系统中的galera cluseter环境发生A DDL操作后,B节点未同步的情况,同时B节点的errorlog中有如下警告信息: 2016-07-23 17:31:32 18920 [War ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.3.Oracle 集群节点间连通失败
1.检查节点连通性的错误 [grid@linuxrac1 grid]$ ./runcluvfy.sh stage -post hwos -n linuxrac1,linuxrac2 -verbose ...
- Cassandra1.2文档学习(2)——节点间通信协议之gossip协议
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- RAC 安装完成后 节点间通信不依赖于SSH
RAC 安装完成后,想修改ssh 的端口.google了一下.原文https://community.oracle.com/thread/2444594?tstart=0 原文说的是11g,10g也好 ...
- JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)
利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对 ...
- dfs 无向图两节点间的所有路径
标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如 ...
随机推荐
- 前端 css+js实现返回顶部功能
描述: 本文主要是讲,通过css+js实现网页中的[返回顶部]功能. 实现代码: HTML: <div> <button onclick="returnTop()" ...
- idea 断点调试
一.步骤控制 二.查看变量 IDEA debug查看变量值有3种方法: 1.鼠标悬浮 2.alt+f8快捷键(选中变量表达式,比如匿名变量或方法参数,再按atl+f8,接着回车) 3.debug窗口查 ...
- 一个好玩的计算题目(c++ 位运算)
2015/11/10 在一个qq群里面,看到一个好玩的题目.“int foo(int x){return x&-x} foo(2^31-3)这个怎么算 ?” 1.自己也就开始算了: (1) ...
- matlab中关于函数句柄、feval函数以及inline函数的解析 (转)
http://blog.sina.com.cn/s/blog_7bff755b010180l3.html MATLAB函数句柄 函数句柄(Function handle)是MATLAB的一种数据类型. ...
- 前段js初学总结
常用的js整理 confirm("此次修改操作会清空所有基础数据!!!您确定要修改吗?") <a onclick="delBasisData('${data['_i ...
- MEMCACHE与REDIS
千万数据量的高并发,容灾. Redis 基于单线程, 持久性 多数据类型 内存中只存KEY Redis支持数据的备份,即master-slave模式的数据备份. Redis与Memcached的区别 ...
- JDK/bin目录下的不同exe文件的用途
新安装完JDk 大家是否发现安装目录的bin文件夹有很多exe文件 下面就为大家讲解不同exe文件的用途 javac:Java编译器,将Java源代码换成字节代 java:Java解释器,直接从类文件 ...
- 前端统计利器:Sentry & Matomo
今天主要说下两款前端统计工具的使用,Sentry & Matomo.以下主要是统计代码接入方式,因此使用前提是你已经在自己的服务器上搭建好了Sentry和Matomo的服务器 Sentry统计 ...
- 使用 CSS 根据兄弟元素的个数来调整样式
在某些场景下,我们需要根据兄弟元素的总数来为它们设置样式.最常见的场景就是,当一个列表不断延长时,通过隐藏控件或压缩控件等方式来节省屏幕空间,以此提升用户体验. 为保证一屏内容能展示更多的内容,需要将 ...
- 洛谷 P4011 孤岛营救问题【最短路+分层图】
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...