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通信原理的更多相关文章

  1. Hadoop的RPC工作原理

    RPC远程过程调用: Hadoop的远程过程调用(Remote Procedure Call,RPC)是Hadoop中核心通信机制,RPC主要通过所有Hadoop的组件元数据交换,如MapReduce ...

  2. RPC通信原理(未完,先睡觉)

    一 背景 OpenStack 各组件之间是通过 REST 接口进行相互通信,比如Nova.Cinder.Neutron.Glance直间的通信都是通过keystone获取目标的endpoint,即ap ...

  3. hadoop的RPC通信

    RPC(remote procedure call)远程调用 不同的Java进程间的对象方法调用 一方称作服务端(server),一方称作客户端(client) server端提供对象,供客户端调用, ...

  4. RPC通信原理

    什么是 RPCRPC(Remote Procedure Call Protocol)远程过程调用协议.通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算上的某个过程或函数,就像调用本地应 ...

  5. Hadoop之RPC

           Hadoop的RPC主要是通过Java的动态代理(Dynamic Proxy)与反射(Reflect)实现,代理类是由java.lang.reflect.Proxy类在运行期时根据接口, ...

  6. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  7. Hadoop源码解析之 rpc通信 client到server通信

    rpc是Hadoop分布式底层通信的基础,无论是client和namenode,namenode和datanode,以及yarn新框架之间的通信模式等等都是采用的rpc方式. 下面我们来概要分析一下H ...

  8. HDFS(二) 底层通信原理——RPC 及 动态代理

    一.RPC(Remote Procedure Call  ) :远程过程调用 1.RPC是远程过程调用协议,实现调用者和被调用者二地之间的连接和通信.其基本通信模型是基于client/server进程 ...

  9. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介

    实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...

随机推荐

  1. 使用Autofac,提示重写成员“Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(System.Type)”时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。

    接触Autofac大概有2天左右,第2天,亲自动手搭建demo,搭完,以为大功告成的时候,提示了这个错误,网上找了很多方法,都没有解决. 为以后的朋友,避免踩坑,分享一下我的解决方法. Dmeo我是新 ...

  2. C#之设计模式之六大原则(转载)

    设计模式之六大原则(转载) 关于设计模式的六大设计原则的资料网上很多,但是很多地方解释地都太过于笼统化,我也找了很多资料来看,发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂,因此转载过来 ...

  3. 是否可能两个ETH私钥对应同一个地址

    原提问在这里. 笔者在使用到neon-js中的私钥生成方法时发现其使用了getRandomValues方法来生成64字符长度的私钥,进而考虑到其随机性,若是调用足够多次,依然有可能生成两个完全一样的私 ...

  4. [ZJOI 2006]书架

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  5. UVA11552:Fewest Flops

    发现如果只有一块就是种类的数目,也就是同种放在一起, 再考虑多块,如果违背的上面的规律,可以发现不会更优, 于是问题就是求在满足同种类放在一起的前提下,尽量使得相邻块的两端一模一样 然后dp一下就可以 ...

  6. 17.10.28&29

    28上午 骚猪选讲 28下午 BOZJ 1081 [SCOI2005]超级格雷码 感觉就是一个找规律,然后模拟输出.半天没找到一个比较简便的模拟方法,这份代码是学习网上一位大佬的,很巧妙. 代码: # ...

  7. 【Rain in ACStar HDU-3340】

    ·你正从AC星球返回,天又下起凸包雨,只好到线段树下躲雨. ·英文题,述大意:       一个竖直平面的美丽天空,会下凸包雨.凸包雨指的是边数为3~6的多边形,并且每一个它都遵守一个神奇定律,那就是 ...

  8. RabbitMQ-Spring AMQP

    上篇文章RabbitMQ基础入门学习了rabbitMQ一些基础的api,当然spring也在原生代码的基础上做了更多的封装,这篇文章就基于spring-rabbit,学习一下spring的实现. p. ...

  9. JS文件中获取contextPath的方法

    function getContextPath() {    var pathName = document.location.pathname;    var index = pathName.su ...

  10. linux安装mysql数据库

    安装mysql 1.下载MySQL的安装文件 安装MySQL需要下面两个文件: MySQL-server-4.0.23-0.i386.rpm MySQL-client-4.0.23-0.i386.rp ...