Hadoop的RPC通信原理
RPC调用;
RPC(remote procedure call)远程过程调用;
不同java进程间的对象方法的调用。
一方称作服务端(server),一方称为客户端(client);
server端提供对象,共客户端调用的, 被调用的对象的执行发生在server端。
RPC是hadoop框架运行的基础(hadoop是建立在RPC机制之上的,建立c/s模式上的);
使用hadoop的RPC做一个小例子,理解hadoop体系结构运行的原理:
先运行 MyServer 在运行MyClient
package rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
public class MyServer {
public static final String SERVER_ADDRESS = "localhost";
public static final int SERVER_PROT = 12345;
//Server端提供对象的方法供客户端运行的,
public static void main(String[] args) throws Exception {
/**
* 构造 an RPC server.
* @param instance 实例中的方法会被客户端调用,特点:要实现VersionedProtocol接口,还必须是一个接口
* 在客户端 要调用的方法必须在我们这个对象的接口中
* @param bindAddress 绑定的这个地址用语监听连接的到来
* @param port 绑定的这个端口用语监听连接的到来
* @param conf the configuration to use
*/
Server server = RPC.getServer(new MyBiz(), SERVER_ADDRESS, SERVER_PROT, new Configuration());
server.start();
}
}
package rpc;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class MyClient {
public static void main(String[] args) throws Exception {
/**构造一个客户端的代理对象,这个代理对象实现了一个指定的协议,
*这个协议可以和指定地址的服务端通信的
* Construct a client-side proxy object that implements the named protocol,
* talking to a server at the named address. */
MyBizable proxy = (MyBizable) RPC.waitForProxy(MyBizable.class, MyBizable.VERSION, new InetSocketAddress(MyServer.SERVER_ADDRESS, MyServer.SERVER_PROT), new Configuration());
String result = proxy.hello(" world!");
System.out.println("客户端调用的结果:" + result);
RPC.stopProxy(proxy);
}
}
package rpc;
import org.apache.hadoop.ipc.VersionedProtocol;
public interface MyBizable extends VersionedProtocol{
public static final long VERSION=12312322L;
public abstract String hello(String name);
}
package rpc;
import java.io.IOException;
public class MyBiz implements MyBizable{
/* (non-Javadoc)
* @see rpc.MyBizable#hello(java.lang.String)
*/
@Override
public String hello(String name){
//却换的Server短输出台查看是否打印这句,说明是在server执行的
System.out.println("我被调用了");
return "hello"+name;
}
@Override
public long getProtocolVersion(String protocol, long clientVersion) throws IOException {
return MyBizable.VERSION;
}
}
通过例子获得的认识:
服务端提供的对象必须是一个接口,接口extends VersionedProtocol接口,为什么?因为JDK反射代理要求必须是一个接口。
客户端能够调用的对象中的方法必须位于对象的接口中;
这个就是RPC通信;
使用cmd jps可以查看到MyServer,说明hadoop start-all.sh里面的五个java进程指的是RPC的服务端(可以通过查看源码NameNode的mian方法点去看);
我们观察 NameNode 的源代码,可以看到 NameNode 确实创建了RPC 的服务端。
具体步骤:
NameNode的main方法→createNameNode→
new NameNode→initialize→ 如下图
// create rpc server
InetSocketAddress dnSocketAddr = getServiceRpcServerAddress(conf);
if (dnSocketAddr != null) {
int serviceHandlerCount =
conf.getInt(DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_KEY,
DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_DEFAULT);
this.serviceRpcServer = RPC.getServer(this, dnSocketAddr.getHostName(),
dnSocketAddr.getPort(), serviceHandlerCount,
false, conf, namesystem.getDelegationTokenSecretManager());
this.serviceRPCAddress = this.serviceRpcServer.getListenerAddress();
setRpcServiceServerAddress(conf);
}
this.server = RPC.getServer(this, socAddr.getHostName(),
socAddr.getPort(), handlerCount, false, conf, namesystem
.getDelegationTokenSecretManager());
// The rpc-server port can be ephemeral... ensure we have the correct info
this.serverAddress = this.server.getListenerAddress();
FileSystem.setDefaultUri(conf, getUri(serverAddress));
LOG.info("Namenode up at: " + this.serverAddress);
Hadoop的RPC通信原理的更多相关文章
- Hadoop的RPC工作原理
RPC远程过程调用: Hadoop的远程过程调用(Remote Procedure Call,RPC)是Hadoop中核心通信机制,RPC主要通过所有Hadoop的组件元数据交换,如MapReduce ...
- RPC通信原理(未完,先睡觉)
一 背景 OpenStack 各组件之间是通过 REST 接口进行相互通信,比如Nova.Cinder.Neutron.Glance直间的通信都是通过keystone获取目标的endpoint,即ap ...
- hadoop的RPC通信
RPC(remote procedure call)远程调用 不同的Java进程间的对象方法调用 一方称作服务端(server),一方称作客户端(client) server端提供对象,供客户端调用, ...
- RPC通信原理
什么是 RPCRPC(Remote Procedure Call Protocol)远程过程调用协议.通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算上的某个过程或函数,就像调用本地应 ...
- Hadoop之RPC
Hadoop的RPC主要是通过Java的动态代理(Dynamic Proxy)与反射(Reflect)实现,代理类是由java.lang.reflect.Proxy类在运行期时根据接口, ...
- Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法
最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...
- Hadoop源码解析之 rpc通信 client到server通信
rpc是Hadoop分布式底层通信的基础,无论是client和namenode,namenode和datanode,以及yarn新框架之间的通信模式等等都是采用的rpc方式. 下面我们来概要分析一下H ...
- HDFS(二) 底层通信原理——RPC 及 动态代理
一.RPC(Remote Procedure Call ) :远程过程调用 1.RPC是远程过程调用协议,实现调用者和被调用者二地之间的连接和通信.其基本通信模型是基于client/server进程 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介
实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...
随机推荐
- 前端之旅HTML与CSS篇之IE6常见BUG
1.IE6怪异解析之padding与border算入宽高原因:未加文档声明造成非盒模型解析解决方法:加入文档声明<!doctype html> 2.IE6在块元素.左右浮动.设定marin ...
- [LeetCode] Reverse Words in a String III 翻转字符串中的单词之三
Given a string, you need to reverse the order of characters in each word within a sentence while sti ...
- servlet之重写
package app02a;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;impo ...
- [Codeforces 864B]Polycarp and Letters
Description Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s con ...
- [POI2006]OKR-Periods of Words
题目描述 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A ...
- bzoj1127[POI2008]KUP 悬线法
Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 485 Solved: 174[Submit][Status][D ...
- 《Java技术》第二次作业--面向对象基础
(一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String a ...
- Linux学习之CentOS(九)-----文件与目录的默认权限与隐藏权限
文件与目录的默认权限与隐藏权限 一个文件有若干个属性, 包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略 ...
- 阿里云部署mongdb(CentOS)
配置包管理系统 (yum). Xshell登录Linux查看操作系统版本信息 lsb release -a 可以在官网选择对应的版本 :官网的安装指导文档http://docs.mongodb.org ...
- 图片人脸检测——Dlib版(四)
上几篇给大家讲了OpenCV的图片人脸检测,而本文给大家带来的是比OpenCV更加精准的图片人脸检测Dlib库. 点击查看往期: <图片人脸检测——OpenCV版(二)> <视频人脸 ...